Почему я всегда получаю ту же последовательность случайных чисел с рэндом ()?

С компилятором Microsoft [1], статические переменные, которые не являются int - как, могут также быть определены в заголовочном файле, но за пределами объявления класса, с помощью Microsoft, конкретной __declspec(selectany).

class A
{
    static B b;
}

__declspec(selectany) A::b;

Примечание, что я не говорю это, хорошо, я просто говорю, что оно может быть сделано.

[1] В эти дни, больше компиляторов, чем поддержка MSC __declspec(selectany) - по крайней мере, gcc и лязг. Возможно, еще больше.

50
задан Dan D. 28 April 2012 в 16:48
поделиться

11 ответов

Вы должны его засеять. Хорошая идея - заполнить его временем:

srand ()

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  srand ( time(NULL) );
  printf ("Random Number: %d\n", rand() %100);
  return 0;
}

Вы получите ту же последовательность, потому что rand () автоматически получает значение 1, если вы не вызываете ] srand () . ​​

Edit

Из-за комментариев

rand () вернет число от 0 до RAND_MAX (определено в стандартной библиотеке). Использование оператора по модулю (% ) дает остаток от деления rand () / 100 . Это заставит случайное число находиться в диапазоне 0-99. Например, чтобы получить случайное число в диапазоне от 0 до 999, мы применим rand ()% 1000 .

85
ответ дан 7 November 2019 в 10:29
поделиться

Здесь много ответов, но, похоже, никто не знает на самом деле объяснил, почему rand () всегда генерирует одну и ту же последовательность при одном и том же семени - или даже о том, что действительно делает семя. Итак, начнем.

Функция rand () поддерживает внутреннее состояние. Концептуально это можно рассматривать как глобальную переменную некоторого типа с именем rand_state. Каждый раз, когда вы вызываете rand (), он делает две вещи. Он использует существующее состояние для вычисления нового состояния и новое состояние для вычисления числа, которое будет возвращено вам:

state_t rand_state = INITIAL_STATE;

state_t calculate_next_state(state_t s);
int calculate_return_value(state_t s);

int rand(void)
{
    rand_state = calculate_next_state(rand_state);
    return calculate_return_value(rand_state);
}

Теперь вы можете видеть, что каждый раз, когда вы вызываете rand (), он заставляет rand_state перемещаться на один шаг по заранее определенному пути.

11
ответ дан 7 November 2019 в 10:29
поделиться

rand () возвращает псевдослучайных чисел. Он генерирует числа на основе заданного алгоритма. Начальная точка этого алгоритма всегда одна и та же, поэтому вы увидите одну и ту же последовательность, генерируемую для каждого вызова. Это удобно, когда вам нужно проверить поведение и согласованность вашей программы.

Вы можете установить «начальное число» случайного генератора с помощью функции srand (вызовите srand только один раз в программе). распространенный способ получить различные последовательности из генератора rand () - установить в качестве начального числа текущее время или идентификатор процесса:

srand (time (NULL)); или srand (getpid ( )); в начале программы.

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

34
ответ дан 7 November 2019 в 10:29
поделиться

Если я помню цитату из основополагающей работы Кнута " Искусство программирования »в начале главы, посвященной генерации случайных чисел, звучит так:

« Любой, кто пытается генерировать случайные числа математическими средствами, технически говоря, находится в состоянии греха »

. ] Проще говоря, стандартные генераторы случайных чисел являются алгоритмами, математическими и на 100% предсказуемыми. На самом деле это хорошо во многих ситуациях, когда желательна повторяемая последовательность «случайных» чисел - например, для определенных статистических упражнений, где вы не хотите «колебаться». в результате появляются действительно случайные данные благодаря эффектам кластеризации.

Хотя захват битов «случайных» данных из аппаратного обеспечения компьютера является второй популярной альтернативой, он также не является действительно случайным - хотя чем сложнее операционная среда, тем больше возможностей для случайности - или, по крайней мере, непредсказуемости.

Истинно генераторы случайных данных обычно обращаются к внешним источникам. Радиоактивный распад - фаворит, как и поведение квазаров. Все, что связано с квантовыми эффектами, по сути, случайно - к большому раздражению Эйнштейна.

Это тоже не совсем случайность - хотя чем сложнее операционная среда, тем больше возможностей для случайности - или, по крайней мере, непредсказуемости.

Истинно случайные генераторы данных обычно обращаются к внешним источникам. Радиоактивный распад - фаворит, как и поведение квазаров. Все, что связано с квантовыми эффектами, по сути, случайно - к большому раздражению Эйнштейна.

они тоже не совсем случайны - хотя чем сложнее операционная среда, тем больше возможностей для случайности - или, по крайней мере, непредсказуемости.

Истинно случайные генераторы данных обычно обращаются к внешним источникам. Радиоактивный распад - фаворит, как и поведение квазаров. Все, что связано с квантовыми эффектами, по сути, случайно - к большому раздражению Эйнштейна.

9
ответ дан 7 November 2019 в 10:29
поделиться

Это из http: // www .acm.uiuc.edu / webmonkeys / book / c_guide / 2.13.html # rand :

Объявление:

void srand(unsigned int seed); 

Эта функция запускает генератор случайных чисел, используемый функцией rand. Заполнение srand одним и тем же начальным значением приведет к тому, что rand вернет ту же последовательность псевдослучайных чисел. Если srand не вызывается, rand действует так, как если бы был вызван srand (1).

2
ответ дан 7 November 2019 в 10:29
поделиться

Цитата из man rand :

Функция srand () устанавливает свой аргумент как семя для новой последовательности возвращаемые псевдослучайные целые числа пользователя rand (). Эти последовательности повторяется путем вызова srand () с такое же начальное значение.

Если начальное значение не указано, Функция rand () автоматически с начальным значением 1.

Таким образом, без начального значения rand () принимает начальное значение как 1 (каждый раз в вашем случае) и с тем же начальным значением, rand ( ) даст ту же последовательность чисел.

19
ответ дан 7 November 2019 в 10:29
поделиться

вызов srand (sameSeed) перед вызовом rand () . Подробнее здесь .

0
ответ дан 7 November 2019 в 10:29
поделиться

rand () возвращает следующее (псевдо) случайное число в серии. Что происходит, у вас одна и та же серия при каждом запуске (по умолчанию «1»). Чтобы засеять новую серию, вы должны вызвать srand () до того, как начнете вызывать rand ().

Если вы хотите что-то случайное каждый раз, вы можете попробовать:

srand (time (0));
2
ответ дан 7 November 2019 в 10:29
поделиться

Генераторы случайных чисел на самом деле не случайны, они, как и большинство программ, полностью предсказуемы. Что делает rand, так это создает другое псевдослучайное число каждый раз, когда оно называется One, которое кажется случайным. Чтобы использовать его правильно, вам нужно дать ему другую отправную точку.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  /* initialize random seed: */
  srand ( time(NULL) );

  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());

  return 0;
}
7
ответ дан 7 November 2019 в 10:29
поделиться

Заполнение rand ()

void srand (unsigned int seed)

Эта функция устанавливает начальное число в качестве начального числа для новой серии псевдослучайных чисел. Если вы вызываете rand до того, как семя было установлено с помощью srand, оно использует значение 1 как семя по умолчанию.

Чтобы создавать разные псевдослучайные серии при каждом запуске вашей программы, выполните srand (time (0))

0
ответ дан 7 November 2019 в 10:29
поделиться

Никто из вас, ребята, не отвечает на его вопрос.

с этим кодом я получаю одну и ту же последовательность каждый раз, когда код, но он генерирует случайные последовательности, если я добавляю srand (/ somevalue /) перед циклом for. может кто-нибудь объяснить почему?

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

0
ответ дан 7 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: