【问题标题】:How do you create pseudo random numbers sequentially in c/c++?如何在 c/c++ 中按顺序创建伪随机数?
【发布时间】:2011-08-06 23:44:03
【问题描述】:
srand(time(NULL));
for (it=hand.begin(); it < hand.end(); it++)
    (*it) = rand() % 13 + 1;

此代码不能一次创建多个随机数。 有没有办法做到不像 Mersennes 那样复杂并且不依赖于操作系统?

【问题讨论】:

  • 我觉得这句话"This code does not work to create many random numbers on a time" ....不够清楚!
  • 重复了很多次。您只能播种(即致电srand一次。然后你就一遍又一遍地打电话给rand。基本上所有 PRNG 都是这样工作的。
  • xkcd 在哪里? ...Ah! :)
  • @pmg: 这个xkcd?
  • 我才发现我贴错了代码!我不会不止一次地播种兰特。我只播种一次,然后在连续生成许多随机数时,它们的结果都是一样的,因为它们是基于当前秒的。

标签: c++ c random time seed


【解决方案1】:

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】:

    在程序开始时只调用一次srand。然后调用rand()不是srand(rand()))生成每个随机数。

    【讨论】:

      【解决方案3】:

      Boost.Random 有很多很好用的随机数生成器。

      【讨论】:

        【解决方案4】:

        George Marsaglia 不久前在 sci.math 上发布了 Multiply With Carry PRNG

        我不能说它有多好或表现如何,但你可能想试一试。

        它应该独立于操作系统和平台。

        【讨论】:

          【解决方案5】:

          “请确保你回答了这个问题” 好的

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

          效率可能存在问题...

          【讨论】:

            猜你喜欢
            • 2011-11-29
            • 1970-01-01
            • 1970-01-01
            • 2018-07-07
            • 1970-01-01
            • 2022-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多