arc4random (mac os x)有多随机?(或者我做错了什么?)

15

我正在使用Swift/MacOS_X进行优化的生命游戏实现。第一步:随机生成一个大格子的细胞(50%存活)。

代码:

for(var i=0;i<768;i++){
  for(var j=0;j<768;j++){
    let r = Int(arc4random_uniform(100))
    let alive = (aliveOdds > r)
    self.setState(alive,cell: Cell(tup:(i,j)),cells: aliveCells)
  }
}

我期望得到相对均匀的随机性,但实际上出现了明显的规律:

Large image

稍微放大一下左下角:

zoomed in

(我在每32行和列都将颜色更改为黑色,以查看是否与2的幂对齐)。

有什么线索能够解释这些规律吗?我已经尝试过:

  • rand()替换arc4random。
  • 在每次调用arc4random_uniform之前添加arc4stir()
  • 移动显示(以确保该模式存在于数据中,而不是显示故障)。

有关下一步的想法?


1
确实非常奇怪,你可以尝试使用种子随机数生成器,例如drand48()(使用srand48(Int)进行种子初始化),它的随机性与arc4random()一样好,并返回0到1之间(不包括1)的Double类型。另请参阅:http://nshipster.com/random/ - Kametrixom
2
我越来越怀疑这根本不是arc4rand... 仍在进行实验,如果我有所发现,我会回来报告的。 - pmeyer
2
好的,现在这已经变得非常烦人了。我再也无法重现这个问题了。我已经遇到了几天(大部分时间都忽略它,因为我正在处理模拟部分)。然而,使用上面发布的随机生成代码,我现在得到了一个我称之为均匀场的东西。毫无头绪。 - pmeyer
我明白了,但至少你提供了一张图片作为证据;)。但你确定你没有更改任何相关的东西吗?也许可以检查一下旧版本,看看是否再次出现? - Kametrixom
这就是源代码控制的作用...你可能有第二个线程不时地初始化arc4random()。仍然很奇怪。 - gnasher729
1
我正在编写一个小的生命程序,但没有进行检查。嗯,好吧。在某些版本中我有第二个线程,但即使我在主线程同步运行,我仍然遇到了问题。虽然这个问题已经解决了,但很烦人的是我从未找到根本原因。 - pmeyer
1个回答

1
  1. 你无法击中任何一个可显示集合(16 *(2 ** 31)-1)的周期或那么多普通的非均匀集群。

这些明显是损坏/未初始化内存的迹象。例如,您正在初始化768x768字段,但正在展示我们1024xsomething字段。

  1. 尝试将Int(arc4random_uniform(100))替换为100以查看效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接