上面是使用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值。
答案 0 :(得分:4)
答案 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)。