【问题标题】:Is there a better function than rand()?有比 rand() 更好的函数吗?
【发布时间】:2013-05-18 11:40:10
【问题描述】:

我有一个 C 语言程序,它使用 0-999 的随机数创建一个由 1000 个整数组成的数组,然后对该数组执行某种算法。为了测试算法的运行时间,我尝试运行程序 10000 次,但每次运行它的数组对于几个数组都是相同的,然后它会改变。我已经使用srand() 函数用当前时间喂种子,但它仍然没有帮助。

rand() 是否有替代解决方案或解决此问题的方法? 我的功能是:

void getarray(int *ptr1, int size, int option){
    int n;
    srand(time(NULL));
    for(n=0; n<size; n++)
        *(ptr1+n) = *(ptr2+n)= rand()%1000; 
}

提前致谢!

【问题讨论】:

  • 你应该只调用 srand 一次:在程序启动时。
  • 正如@Pubby 所说。否则,由于时间差太小,您最终会多次播种相同的种子。这将导致您的随机序列从伪随机数字序列中的完全相同的点开始。
  • 我试图找到最好的;一些明显的重复是由于根本没有调用srand() 而引起的问题。 Recommended way to initialize srand? 的可能重复项
  • rand()%1000 不是好的做法,它不提供均匀分布。有更好的选择 - arc4random_uniform。不过这是针对 Unix 的

标签: c random srand


【解决方案1】:

您应该只调用 srand 一次:在程序启动时。

现在,如果您在 time 更改之前多次调用您的函数,您的顺序将是相同的。

【讨论】:

    【解决方案2】:

    lrand48() 调用往往具有更多内部状态和更好的伪随机数分布。

    但是,请注意,您重新播种的粒度仅为 1 秒,因此同一秒内的调用将生成相同的序列。将您的 srand() 呼叫放入 main() 或某处,一次,而不是在 getarray 中调用它。

    【讨论】:

      【解决方案3】:

      您应该非常仔细地调查rand() 是否是该工作的更好 功能。

      它因编译器和平台而异,但通常被实现为“Linear congruential generator”,这在速度和内存使用方面非常方便,但统计属性很差(即,您可以判断是否已生成足够长的序列通过全等随机生成器或者如果它是真正随机的)。

      在您的用例(测试算法的速度)中,使用rand() 可能完全没问题,只要执行不受数据统计属性的影响。如果rand() 是线性同余 RNG,则数列显示出一种模式,这意味着在任何给定时间,并非所有数字都是等概率的。这张维基百科图片中有一个很好的例子:

      您的系统可能还具有 RNG(例如 /dev/random)及其相关函数,但请注意,这些函数旨在产生少量高质量随机数,并且使用起来可能非常缓慢。您甚至可能会用完数字并最终等待系统收集更多的熵!

      ISAAC 是一个简单、非常快速的 RNG,其统计特性足以用于密码学。就我个人而言,每当我需要像样的随机数时,我都会使用它。

      另一种选择是使用由RANDOM.org 或HotBits 生成的真正随机数,但在您的情况下这可能有点矫枉过正。

      附带说明一下,RANDOM.ORG 有一个很好的 page on RNG 和另一个由 PHP rand() 函数创建的“模式”示例

      【讨论】:

      • +1 提供了一个非常有趣和有价值的答案,但我认为这在绝大多数情况下都是矫枉过正的。
      【解决方案4】:

      首先,调用种子函数一次,而不是循环调用。

      其次,我建议你:

      1) 切换到 random(3) 函数 2) 从 rand48 / lrand48 中挑选一些东西 3) 自己读取 /dev/random 所需的字节数。

      解决方案 1) 简单且具有一定的便携性。 2 需要一点思考,3 工作量最大,便携性最差。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2019-04-02
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        相关资源
        最近更新 更多