我有以下代码在 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("")
}
运行此代码会生成如下所示的网格:
..##..#.#...#..#..#.#.####.#..
..#..#..#.#.####.#....###.#.#.
#.####.#....###.#.#.#####.....
..###.#.#.#####.....#...#....#
#####.....#...#....###.##.###.
#...#....###.##.###..#.....#..
##.##.###..#.....#...##..#.##.
.#.....#...##..#.##...#.####..
.##..#.##...#.####..###..#.#.#
..#.####..###..#.#.#.#..#.....
###..#.#.#.#..#.........#...##
.#..#.........#...##.##.......
....#...##.##............#...#
.##............#...####....##.
.....#...####....##..#.#.....#
###....##..#.#.....#........#.
.#.#.....#........#...#.#..#..
........#...#.#..#......#....#
..#.#..#......#....#.##.#...##
....#....#.##.#...###...#..#..
.##.#...###...#..#..#.#..#...#
#...#..#..#.#..#...#####...##.
#.#..#...#####...##..#.......#
####...##..#.......#.#.#.....#
.#.......#.#.#.....##.........
.#.#.....##..........##.#..#.#
#..........##.#..#.##.#.#.....
.##.#..#.##.#.#.....##...#....
#.#.#.....##...#......#.##....
##...#......#.##.....#.######.
您可以清楚地看到一个模式在重复。有没有办法“抛”函数,让生成更有说服力?
最佳答案
你的打印函数是错误的:tile[y*10 + x]
应该是 tile[y*30 + x]
。
至于生成网格:您到底想要什么?
如果答案是“从所有可能 30x30 网格空间的均匀分布中随机选择,其中每个单元格是#
或。
”,那么您应该简单地选择具有相同概率的每个单元格 #
和 。
:
for i in 0..<900 {
// arc4random_uniform(2) is either 0 or 1, with equal probability
tile.append(arc4random_uniform(2) == 0 ? "." : "#")
}
如果答案是“从 30x30 网格的均匀分布中随机选择,其中 恰好 400 个单元格 是 #
”,那么您应该预先选择 400 个唯一索引, 在将它们转换为 #
之前。
照原样,您的代码可能生成只有一个#
的网格(尽管这种可能性很小)。而且它永远不会生成超过 400 个 #
的网格。
关于swift - 在 Swift 中使用 arc4random 避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31422181/