假设你正在做一个游戏,这个游戏已经从一个种子生成了地形,用户在他的世界创建菜单中输入了这个种子。
这个种子生成一组值,只有当种子改变时才会改变
例如,假设您希望在for循环中生成一个随机整数集,并从数组中随机提取一个整数集,每次都保持不变,每次运行for循环时都以完全相同的顺序从数组中提取相同的项,直到更改种子
一个人怎么能迅速做到这一点
在我的代码中,我可以让地形生成,但每次生成的地形都不一样,这就是我试图让它做的事情

override func didMove(to view: SKView) {

    let tile1 = SKTileDefinition(texture: SKTexture(imageNamed: "stone") ,size: CGSize(width: 64, height: 64))
    let tile2 = SKTileDefinition(texture: SKTexture(imageNamed: "water") ,size: CGSize(width: 64, height: 64))
    let tile3 = SKTileDefinition(texture: SKTexture(imageNamed: "sand") ,size: CGSize(width: 64, height: 64))
    let tile4 = SKTileDefinition(texture: SKTexture(imageNamed: "grass") ,size: CGSize(width: 64, height: 64))

    let tileGroup1 = SKTileGroup(tileDefinition: tile1)
    let tileGroup2 = SKTileGroup(tileDefinition: tile2)
    let tileGroup3 = SKTileGroup(tileDefinition: tile3)
    let tileGroup4 = SKTileGroup(tileDefinition: tile4)
    let tileGroup5 = SKTileGroup(tileDefinition: tile4)
    let tileGroup6 = SKTileGroup(tileDefinition: tile4)

    let tileSet = SKTileSet(tileGroups: [tileGroup1,tileGroup2,tileGroup3,tileGroup4,tileGroup5,tileGroup6])

    let columns = 5
    let rows = 5

    let tileSize = CGSize(width: 64, height: 64)

    //this is another GKNoise class called Noise
    let noise = Noise()
    let noiseMap = GKNoiseMap(noise, size: vector_double2(10.0,10.0), origin: vector_double2(0.0,0.0), sampleCount: vector_int2(100), seamless: true)
    //this is another SKTileMapNode Class called TileMap and a class func called tileMapNodes
    let tileMap = TileMap.tileMapNodes(tileSet: tileSet, columns: columns, rows: rows, tileSize: tileSize, from: noiseMap, tileTypeNoiseMapThresholds: [(-1.0 as NSNumber),(+1.0 as NSNumber)])

    tileMapNode = tileMap.first!

    let seed = Int

    for column in 0 ..< tileMapNode.numberOfColumns {
        for row in 0 ..< tileMapNode.numberOfRows {
            let rand = Int(arc4random_uniform(UInt32(tileSet.tileGroups.count)))
            print(rand)
            let tile = tileMapNode.tileSet.tileGroups[rand]
            tileMapNode.setTileGroup(tile, forColumn: column, row: row)
        }
    }

最佳答案

如果要基于特定种子使用生成随机值:srand48drand48
srand允许您指定种子:

    srand48(230)

然后drand48将给您一个介于0和1之间的双精度值:
    let doubleValue = drand48()

所以在你的例子中,如果你想要一个0到9之间的整数,你可以做如下的事情:
    srand48(230)
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))")
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))")
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))")

它会给你3个伪随机数,直到你改变种子
以下是应用于您的新问题的drand48
let seed = srand48(230)

for column in 0 ..< tileMapNode.numberOfColumns {
    for row in 0 ..< tileMapNode.numberOfRows {
        let rand = Int(Double(tileSet.tileGroups.count) * drand48() - 0.5)
        print(rand)
        let tile = tileMapNode.tileSet.tileGroups[rand]
        tileMapNode.setTileGroup(tile, forColumn: column, row: row)
    }
}

关于swift - 根据种子Swift 3生成随机值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46807118/

10-11 23:12
查看更多