Как вы создаете псевдослучайные числа последовательно в C / C ++? - PullRequest
0 голосов
/ 16 апреля 2011
srand(time(NULL));
for (it=hand.begin(); it < hand.end(); it++)
    (*it) = rand() % 13 + 1;

Этот код не работает для создания множества случайных чисел одновременно.Есть ли способ сделать это, который не так сложен, как Mersennes и не зависит от операционной системы?

Ответы [ 5 ]

4 голосов
/ 16 апреля 2011

PRNG не создают много PRN одновременно.Каждый вывод зависит от предыдущего вывода, PRNG имеют высокую степень состояния.

Попробуйте:

srand(time(NULL)); // once at the start of the program

for( int i = 0; i < N; ++i )
    r[i] = rand();

Даже API, которые возвращают весь блок вывода в одном вызове функции, только что переместили этоцикл внутри функции.

2 голосов
/ 16 апреля 2011

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

1 голос
/ 16 апреля 2011

Boost.Random имеет множество хороших генераторов случайных чисел, которые просты в использовании.

0 голосов
/ 17 апреля 2011

"Пожалуйста, убедитесь, что вы ответили на вопрос" ОК

for (int i=n1; i < n2; ++i)
  { 
  int k; 
  do k = rand(); while (i !=k); 
  // k is a sequential pseudo random number
  }

Могут быть проблемы с эффективностью ...

0 голосов
/ 16 апреля 2011

Джордж Марсаглия опубликовал Multiply With Carry PRNG некоторое время назад в sci.math.

Я не могу сказать, насколько он хорош или как хорошо себя ведет, но вы, возможно, захотите датьЭто попытка.

Она должна быть независимой от ОС и платформы.

...