работа rand в perl

#algorithm #perl

#алгоритм #perl

Вопрос:

Как значение, создаваемое функцией rand, зависит от ее начального значения.Когда мы не определяем какое-либо начальное значение, то чем отличаются его значения? Ниже приведен код, который я нашел для генерации чисел для массива целых чисел, кто-нибудь может объяснить, пожалуйста :

 #!/usr/bin/perl -w

  # Linear search of an array

  # Note that if you later on want to search for something from a
  # list of values, you shouldn’t have used an array in the first
  # place.

  # Generating 10 integers
  $NUM = 10;
  $MAXINT = 100; # 1   the maximum integer generated

  srand(); # initialize the randomize seed

  print "Numbers Generated:n(";
  for $i (1 .. $NUM) {
  push @array, sprintf("%d", rand(1) * $MAXINT);
  print $array[$i-1];
  print ", " unless ($i == $NUM);
  }
  print ")nn";
  

Ответ №1:

Вам не нужно явно вызывать srand; это будет неявно сделано за вас при первом вызове rand, если вы ранее не вызывали srand.

srand без параметров попытается инициализировать генератор случайных чисел в, ошибочное, случайное состояние. Он использует /dev /urandom или подобное, если доступно, и в противном случае возвращается к значению, вычисленному из текущего времени и pid.

rand() без параметров возвращает значение с плавающей запятой между 0 (включительно) и 1 (исключительное значение). Умножение этого значения на некоторое целое число дает значение с плавающей запятой от >= 0 и < этого целого числа. Используя это в целочисленном контексте (например, значение формата ‘%d’), вы получаете целое число от 0 до единицы меньше вашего множителя. rand(x) Для x, отличного от 0, возвращается тот же диапазон случайных чисел, который x * rand() имел бы. Это rand(1) эквивалентно просто rand() , и rand(1) * $MAXINT могло бы быть просто rand($MAXINT) .

Комментарии:

1. какой смысл упоминать rand (1) и как меняется его значение при умножении на MAXINT.

2. Я запускаю ту же программу с небольшим изменением в $ NUM и $ MAXINT. Я использую $ NUM как 2 и $ MAXINT как 4. Поэтому мне нужно только 2 (как указано в $ NUM) случайных значения. Иногда, когда я запускаю эту программу, я получаю одни и те же случайные значения. Как я могу убедиться, что всегда получаю уникальные значения?

3. @пользователь502937: my $MAXINT=5; my $NUM=4; my @array; my %seen; for (1..$NUM) { my $rand=int rand $MAXINT; $seen{$rand} and redo; push @array, $rand } print "(", join(", ", @array), ")nn";

Ответ №2:

Насколько я знаю, perl использует функции генерации псевдослучайных чисел стандартной библиотеки C.
Это может зависеть от реализации, но обычно это линейный конгруэнтный генератор. Этот тип PRNG использует свое предыдущее значение для генерации следующего, поэтому ему потребуется начальное значение, известное как начальное.

Ответ №3:

Ценность инициализации выбранным начальным значением заключается в том, что вы получаете одинаковые псевдослучайные числа. Таким образом, вы можете поддерживать повторяемость некоторых случайных вычислений, например. как разные алгоритмы работают на фиксированном наборе.