可以兰特()真的这个坏? [关闭](Can rand() really be this bad?

2019-09-17 09:58发布

以上是通过使用兰特()来获得随机坐标和在这些坐标添加一个常数的像素值产生的示例图像。 这是它的外观从几千次迭代。 我使用的RAND()从在Mac OS X狮子stdlib.h中,给它时间(NULL)作为种子。

你可以清楚地看到垂直线,仿佛一个奇怪的那些x坐标比那些即使x坐标值较高。

我将如何实现一个更好的算法,或者我在哪里可以找到一个没有多少依赖? (我宁愿只有头文件)。

下面的代码(对不起,我花了这么长):

void generate(int iterations = 1) {
 for (unsigned int x = 0;x < (area * 4);++x) {
  map[rand() % area] += 1;
 }
 number a = min();
 number b = max();
 for (int i = 0;i < area;++i) {
  map[i] -= a;
  map[i] /= b;
 }
}

地图中包含双漂浮,被后来变成RGB值。

Answer 1:

您是否尝试过arc4random() 它提供了比更强和更均匀的随机值rand()

您也可以尝试SecRandomCopyBytes()这是Security.framework的一部分。 这基本上只是从/ dev /随机读取。



Answer 2:

C ++ 11中提供了非常有用的随机数的功能随机 。 见这里和这里了解更多详情。



Answer 3:

我认为这看你怎么使用将是最重要的rand()来提取坐标。 什么是真正令人惊讶的是,你只能看到在x坐标的模式,但不是在y的。 如果真的是在一个缺乏rand()它应该出现在这两个。

这就是说,我可以尝试猜测其中这些模式来自: rand()是众所周知的在高位产生更多的随机性比低的。 因此,人们不应该使用模提取一个较小的范围,因为这样一个只会用更少的随机性拿到低位的部分。

从这个知识,我猜你是提取低位产生的x值和高比特提取y值。 这将使你比沿x轴沿y轴更加随机模式。

如果这是你现在在做什么,还有必须在你的代码,这会导致整个y轴较大的随机性比沿x轴的一些假象。 所以没有看到你的代码是很难说,如果这个实现是有缺陷的。



Answer 4:

在Mac上你可以使用随机的,而不是兰特。 对于该名男子页random音符以下内容:

BUGS

兰特约2/3的速度(3)。

曾经有一个非常弱的直播历史执行情况; 随机序列变化不大与种子。 当前的实现采用初始状态计算更好的伪随机数发生器。

需要加密的高质量的随机性应该使用arc4random应用(3)。



文章来源: Can rand() really be this bad? [closed]
标签: c++ macos random