设置GKARC4RandomSource的种子

时间:2017-04-09 16:11:27

标签: swift random gamekit

我使用GKARC4RandomSource(来自GameKit)生成随机数。设置种子后,我会生成一些随机数。在同一个实例上,但后者,我设置完全相同的种子,我再次生成一些数字。由于种子是相同的,我期待相同的数字,但这不会发生。我错过了什么? 代码:

let randSource = GKARC4RandomSource()

    func foo() {
        print("1st sequence")
        randSource.seed = "seed".data(using: .utf8)!
        for _ in 0...10 {
            print(randSource.nextInt())
        }
    }


    func bar() {
        print("2nd sequence")
        randSource.seed = "seed".data(using: .utf8)!
        for _ in 0...10 {
            print(randSource.nextInt())
        }
    }

    foo()
    bar()

输出: 第一序列 1077893367 -527596564 188760480 -1473410833 1247450388 155479986 -1227640578 -1952625186 -1819582711 1494875350 238061911 第二序列 -815382461 1319464721 -496336642 1307036859 -1543687700 1786062933 63740842 657867659 -1908618575 360960015 75414057

1 个答案:

答案 0 :(得分:0)

documentation for GKARC4RandomSource建议在初始化程序中使用seed

  

使用相同种子数据初始化的任何两个随机源都将   生成相同的随机数序列。要复制   现有GKARC4Random Source实例的行为,请阅读   实例的种子属性然后通过传递创建一个新实例   结果数据到init(seed :)初始化器。

如果您使用init(seed:),则有效:

func foo() {
    print("1st sequence")

    let seed = "seed".data(using: .utf8)!
    let randSource = GKARC4RandomSource(seed: seed)
    for _ in 0...10 {
        print(randSource.nextInt())
    }
}


func bar() {
    print("2nd sequence")

    let seed = "seed".data(using: .utf8)!
    let randSource = GKARC4RandomSource(seed: seed)
    for _ in 0...10 {
        print(randSource.nextInt())
    }
}

foo()
bar()

<强>输出

1st sequence
-907495547
-1853348607
-891423934
-1115481462
-1946427034
-1478051111
1807292425
525674909
-1209007346
-1508915292
-1396618639
2nd sequence
-907495547
-1853348607
-891423934
-1115481462
-1946427034
-1478051111
1807292425
525674909
-1209007346
-1508915292
-1396618639