我使用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
答案 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