【问题标题】:Is it a good idea to try and use the entire rand() table?尝试使用整个 rand() 表是个好主意吗?
【发布时间】:2016-04-07 07:09:55
【问题描述】:

我目前正在使用此代码来随机化一些变量。

srand(time(NULL));
do{vkmhrand = rand ();vkmh = vkmhrand/78;}while(vkmh <= 0 || vkmh > vmax);

vmax 不会超过 415,这意味着如果我让它像 vkmh = rand() 一样简单,大部分随机表将被丢弃,另外我还得到了一些不错的小数以使结果更有趣.

我知道 rand() 并不是最好的随机函数。我只是在想一般来说,尝试尽可能多地使用桌子是个好主意吗?这是浪费时间吗?或者它是否会加剧表格中可能已经存在的任何模式?

【问题讨论】:

  • 你说的随机表是什么意思?
  • 调用 rand() 函数时使用的值表。
  • 表格本身已经是非常好的伪随机了,我无法想象抓取整个表格而不是特定部分会更加随机。显然一个是,但没有理由为什么会是完整的桌子,也许你的小部分可能更随机(偶然)。没有测试就无法真正知道,即使那样,也不足以值得您花时间。
  • @EurekaKN - 它不使用表格 - 请参阅 stackoverflow.com/questions/4768180/rand-implementation
  • @EdHeal - 感谢您的链接。有人告诉我它是从桌子上打电话来的,但我不确定。我问这些问题是因为即使我经常表现出我的无知,但我总能学到一些新东西。

标签: c random numbers


【解决方案1】:

在您的情况下,缩放rand() 的输出实际上意味着您可以使用更多位。假设它们的值彼此独立(对于rand() 的所有实现可能并非如此),这通常是一件好事。但是,您必须注意,这些额外的位并不是用来使高位“更随机”(更难预测),而只是为了给您更多的十进制数字,因此您的解决方案空间具有更精细的分辨率。

在一定范围内生成浮点数的常用方法是:

double vkmh = (double) rand() / RAND_MAX * (vmax-vmin) + vmin; 

如果你对整数没问题,通常的方法是:

unsigned int = rand() % (vmax - vmin + 1) + vmin;

尽管如果RAND_MAX 不是(vmax - vmin + 1) 分布值的倍数,这将导致分布略微偏斜

【讨论】:

    【解决方案2】:

    使用这个,不过我不保证它是随机的

    srand(time(NULL));
    do {
      vkmhrand = rand () % 415;
      vkmh = vkmhrand/78;
    }
    while(vkmh <= 0 || vkmh > vmax);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2010-11-05
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多