在Swift中使用arc4random避免重复

在Swift中使用arc4random避免重复,swift,random,arc4random,Swift,Random,Arc4random,我使用以下代码在Swift中生成随机填充的网格: import Foundation var tile = [String](count: 900, repeatedValue: ".") // Randomly populate the grid with hashes for i in 0...400 { tile[Int(arc4random_uniform(899))] = "#" } // Print the grid to console for y in 0...(2

我使用以下代码在Swift中生成随机填充的网格:

import Foundation

var tile = [String](count: 900, repeatedValue: ".")

// Randomly populate the grid with hashes
for i in 0...400 {
    tile[Int(arc4random_uniform(899))] = "#"
}

// Print the grid to console
for y in 0...(29) {
    for x in 0...(29) {
        print("\(tile[y * 10 + x])")
    }
    println("")
}
运行此代码将生成如下所示的网格:

..##..#.#...#..#..#.#.####.#..
..#..#..#.#.####.#....###.#.#.
#.####.#....###.#.#.#####.....
..###.#.#.#####.....#...#....#
#####.....#...#....###.##.###.
#...#....###.##.###..#.....#..
##.##.###..#.....#...##..#.##.
.#.....#...##..#.##...#.####..
.##..#.##...#.####..###..#.#.#
..#.####..###..#.#.#.#..#.....
###..#.#.#.#..#.........#...##
.#..#.........#...##.##.......
....#...##.##............#...#
.##............#...####....##.
.....#...####....##..#.#.....#
###....##..#.#.....#........#.
.#.#.....#........#...#.#..#..
........#...#.#..#......#....#
..#.#..#......#....#.##.#...##
....#....#.##.#...###...#..#..
.##.#...###...#..#..#.#..#...#
#...#..#..#.#..#...#####...##.
#.#..#...#####...##..#.......#
####...##..#.......#.#.#.....#
.#.......#.#.#.....##.........
.#.#.....##..........##.#..#.#
#..........##.#..#.##.#.#.....
.##.#..#.##.#.#.....##...#....
#.#.#.....##...#......#.##....
##...#......#.##.....#.######.

您可以清楚地看到一个模式正在重复自身。有没有一种方法可以抛出函数以使生成更具说服力?

您的打印函数是错误的:平铺[y*10+x]应该是平铺[y*30+x]

至于生成网格:您到底想要什么

如果答案是在所有可能的30x30网格空间上均匀分布的随机选择,其中每个单元格为或,则您只需选择具有与等概率的每个单元格:

如果答案是从30x30网格上的均匀分布中随机选择,其中正好有400个单元格,那么在将它们转换为之前,您应该预先选择400个唯一索引


按原样,您的代码可能只使用一个网格生成网格,尽管这是非常不可能的。而且它不会产生超过400秒的网格。

您的打印功能是错误的:平铺[y*10+x]应该是平铺[y*30+x]

至于生成网格:您到底想要什么

如果答案是在所有可能的30x30网格空间上均匀分布的随机选择,其中每个单元格为或,则您只需选择具有与等概率的每个单元格:

如果答案是从30x30网格上的均匀分布中随机选择,其中正好有400个单元格,那么在将它们转换为之前,您应该预先选择400个唯一索引

按原样,您的代码可能只使用一个网格生成网格,尽管这是非常不可能的。而且它永远不会产生超过400秒的网格

你只是把900个中的400个转换成了一个 您将有许多重复项被覆盖,因此我希望还有许多“.”。 我想你展示的图案还不错

把你所有的货物放在袋子里,随机地把它们分类,然后一个一个地拿出来

你只是把900个中的400个转换成了一个 您将有许多重复项被覆盖,因此我希望还有许多“.”。 我想你展示的图案还不错


把你所有的货物放在袋子里,随机地把它们分类,然后一个一个地拿出来

这是一个随机实验吗?这是随机性的问题,你不知道它是否是一种模式,人类通常很难识别随机性这是一个随机实验吗?这是随机性的问题,你不知道它是否是一种模式,人类通常很难识别随机性,因为我是按照我的意愿编写程序的;是您确定的不正确的tile[y*10+x]导致了模式中的重复;是您识别的不正确的tile[y*10+x]导致了模式中的重复。计划限制为400,但我只能让程序重复。符号,而不是所有的平铺。本来打算限制为400,但我只能让程序迭代。符号,而不是所有的瓷砖。
for i in 0..<900 {
    // arc4random_uniform(2) is either 0 or 1, with equal probability
    tile.append(arc4random_uniform(2) == 0 ? "." : "#")
}