6

哈哈

上面是通过使用 rand() 获取随机坐标并在这些坐标处的像素值上添加一个常数生成的示例图像。这是几千次迭代后的样子。我在 Mac OS X Lion 中使用 stdlib.h 中的 rand(),将 time(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

4 回答 4

4

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

于 2012-05-21T20:51:28.677 回答
3

你试过arc4random()吗?它提供了比 更强大和更统一的随机值rand()

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

于 2012-05-21T20:49:44.340 回答
3

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

也就是说,我可以尝试猜测这些模式的来源:rand()众所周知,高位比低位产生更多的随机性。因此,永远不应该使用模来提取更小的范围,因为这样只会得到随机性较小的低位部分。

根据这些知识,我猜您正在提取低位以产生 x 值,而高位则用于提取 y 值。这将为您提供沿 y 轴比沿 x 轴更随机的模式。

如果这是您现在正在做的事情,那么您的代码中仍然必须存在一些伪影,这会导致 y 轴上的随机性大于 x 轴上的随机性。所以如果没有看到你的代码,很难判断这个实现是否有缺陷。

于 2012-05-21T20:59:13.527 回答
1

在 mac 上,您可以只使用随机而不是 rand。手册页random注释以下内容:

错误

大约是 rand(3) 速度的 2/3。

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

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

于 2012-05-21T20:59:13.057 回答