兰德()真的可以这么糟糕吗?

时间:2012-05-21 20:46:58

标签: c++ macos random

lol

上面是使用rand()获取随机坐标并在这些坐标处为像素值添加常量而生成的示例图像。这是它从几千次迭代看起来的样子。我在Mac OS X Lion中使用stdlib.h中的rand(),给它时间(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;
 }
}

Map包含双浮点数,后来变为RGB值。

4 个答案:

答案 0 :(得分:4)

C ++ 11在random中提供了非常有用的随机数功能。有关详细信息,请参阅herehere

答案 1 :(得分:3)

你试过arc4random()吗?它提供了比rand()更强大,更均匀的随机值。

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

答案 2 :(得分:3)

我认为最重要的是看看如何使用rand()来提取坐标。真正令人惊讶的是,您只能在x坐标中看到一个模式,而在y坐标中看不到。如果rand()确实存在缺陷,则它应该出现在两者中。

也就是说,我可以尝试猜测这些模式的来源:众所周知rand()在高位中产生的随机性比在低位中产生的随机性要高。因此,不应该使用modulo来提取较小的范围,因为这样只能获得具有较少随机性的低位部分。

根据这些知识,我猜你正在提取低位以产生x值,而高位提取y值。这会给你一个沿y轴比x轴更随机的模式。

如果现在正在进行此操作,则代码中仍然必须存在一些工件,这会导致y轴上的随机性大于沿x轴的随机性。因此,如果没有看到您的代码,很难判断这个实现是否存在缺陷。

答案 3 :(得分:1)

在Mac上你可以使用随机而不是rand。 random的手册页注意到以下内容:

  

<强> BUGS

     

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

     

历史上的实施曾经是非常弱的播种;随机序列与种子的变化不大。当前的实现采用了更好的伪随机数生成器进行初始状态计算。

     

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