基于种子Swift 3生成随机值

基于种子Swift 3生成随机值,swift,random,Swift,Random,假设你正在制作一个游戏,这个游戏已经从用户在他的世界创建菜单中输入的种子程序性地生成了地形 这个种子生成一组值,这些值只有在种子改变时才会改变 例如,假设您希望获得一组随机整数,以在for循环中生成,并从数组中随机抽取。每次运行for循环时,整数集都保持不变,并以完全相同的顺序从数组中抽取相同的项,直到更改种子 如何在swift中实现这一点 在我这里的代码中,我可以让地形生成,但它不会每次都生成相同的地形,这正是我试图让它做的 override func didMove(to view: SKV

假设你正在制作一个游戏,这个游戏已经从用户在他的世界创建菜单中输入的种子程序性地生成了地形

这个种子生成一组值,这些值只有在种子改变时才会改变

例如,假设您希望获得一组随机整数,以在for循环中生成,并从数组中随机抽取。每次运行for循环时,整数集都保持不变,并以完全相同的顺序从数组中抽取相同的项,直到更改种子

如何在swift中实现这一点

在我这里的代码中,我可以让地形生成,但它不会每次都生成相同的地形,这正是我试图让它做的

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)
        }
    }
override func didMove(to view:SKView){
让tile1=SKTileDefinition(纹理:SKTexture(图像名为:“石头”),大小:CGSize(宽度:64,高度:64))
让tile2=SKTileDefinition(纹理:SKTexture(图像名为:“水”),大小:CGSize(宽度:64,高度:64))
让tile3=SKTileDefinition(纹理:SKTexture(图像名为:“sand”),大小:CGSize(宽度:64,高度:64))
让tile4=SKTileDefinition(纹理:SKTexture(图像名为:“草”),大小:CGSize(宽度:64,高度:64))
设TileGroup 1=SKTileGroup(tileDefinition:tile1)
设TileGroup 2=SKTileGroup(tileDefinition:tile2)
设TileGroup 3=SKTileGroup(tileDefinition:tile3)
设TileGroup 4=SKTileGroup(tileDefinition:tile4)
设TileGroup 5=SKTileGroup(tileDefinition:tile4)
设TileGroup 6=SKTileGroup(tileDefinition:tile4)
设tileSet=SKTileSet(tileGroups:[tileGroup1,tileGroup2,tileGroup3,tileGroup4,tileGroup5,tileGroup6])
设列=5
设行数=5
让tileSize=CGSize(宽:64,高:64)
//这是另一个名为Noise的GKNoise类
让噪音=噪音()
设noiseMap=GKNoiseMap(噪声,大小:vector_double2(10.0,10.0),原点:vector_double2(0.0,0.0),样本数:vector_int2(100),无缝:真)
//这是另一个名为TileMap的SKTileMapNode类和一个名为tileMapNodes的func类
设tileMap=tileMap.tileMapNodes(tileSet:tileSet,columns:columns,rows:rows,tileSize:tileSize,from:noiseMap,tileTypeNoiseMapThresholds:[(-1.0作为NSNumber),(+1.0作为NSNumber)])
tileMapNode=tileMap.first!
设seed=Int
对于0..
如果要基于特定种子使用生成随机值:
srand48
drand48

srand允许您指定种子:

    srand48(230)
然后,drand48将为您提供介于0和1之间的双精度:

    let doubleValue = drand48()
因此,在您的情况下,如果希望Int值介于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)
    }
}
let seed=srand48(230)
对于0..
你已经写了一些代码了吗?请发布它-然后我们可以给你一些提示看看这个答案。它提供了你需要的种子行为。很好!非常感谢!有没有办法让它在for循环中生成一个随机数,我可以用它从数组中随机抽取数据?我需要它反复生成相同的数字在中,直到我更改种子,因为代码正在计算列/行并随机设置从数组中随机抽取的纹理,所以它给我一个错误
常量“seed”推断为类型“Void”,这可能是意外的
如何修复?你能重新阅读我的问题吗?我将其更改为我最初的意思我更新了我的答案,但我认为最好避免改变你的问题:)