适用于 iOS 和 Android 的随机数生成器
Posted
技术标签:
【中文标题】适用于 iOS 和 Android 的随机数生成器【英文标题】:Random Number Generator for iOS and Android 【发布时间】:2016-05-06 18:59:48 【问题描述】:我正在为 android 和 ios 构建一个应用程序。在应用程序中,我需要生成在 iOS 版本和 Android 版本中都匹配的伪随机数。我见过许多自定义随机数生成器的实现,但有些是用 C++ 或 php 实现的……我只知道 Java 和 Swift。有人可以帮助我并指出一个可以在 iOS 和 Android 上运行的随机生成器,或者有人可以告诉他们如何创建我自己的随机数生成器的步骤吗?
编辑:“匹配”是指我需要能够播种它,以便它每次都能产生相同的输出。
【问题讨论】:
在每个平台上实现它的困难是什么?在安卓上是new Random().nextInt()
这里是对您有帮助的链接。 Here
“匹配”是什么意思?
为什么不干脆做一些非常简单的事情,比如 XORShift,它是任何语言的一行代码?
【参考方案1】:
randomValue = arc4random() % 255;
在 iOS 上生成 0 到 255 之间的随机值
【讨论】:
【参考方案2】:我将“匹配”解释为您希望 iOS 和 Android 实现在种子相同的情况下产生相同的值序列。您可以使用Mersenne Twister, mt19937 的标准实现来做到这一点。 Apple 通过 GameplayKit 在 Swift 中提供了一个实现。您可以在 Playground 中确认其行为和可复制性:
import GameplayKit
let source = GKMersenneTwisterRandomSource(seed: 123)
source.nextUniform() // => 0.3132002
source.nextUniform() // => 0.5559791
source.nextIntWithUpperBound(20) // => 13
let source2 = GKMersenneTwisterRandomSource(seed: 123)
source2.nextUniform() // => 0.3132002
source2.nextUniform() // => 0.5559791
source2.nextIntWithUpperBound(20) // => 13
根据Apple's documentation,
...如果您初始化一个 GKMersenneTwisterRandomSource 实例和一个 使用相同种子值的兼容实现,两者都生成 相同的数字序列。
我读到它应该与 C++ 或 Java 参考实现产生“匹配”,可以从上面链接的 mt19937 站点下载其源代码。
附录
看起来 GameplayKit 实现提供了可重现的结果,但输出与 Hiroshima 的参考实现不一致。 Here's a port Swift,我几年前为 mt19937 的标准 C 实现做了。当种子相同时,这会产生与 C 参考实现相同的结果。前面提供的链接中提供的 Java 端口也是如此,因此这应该为您提供跨平台一致的解决方案。
【讨论】:
它在 Swift 中工作,但我仍然没有找到与 Java 相同的代码。以上是关于适用于 iOS 和 Android 的随机数生成器的主要内容,如果未能解决你的问题,请参考以下文章
VSCode 中的 Flutter beta 热重载适用于 Web,但不适用于 iOS 和 Android(适用于 Android Studio)
适用于 Android 和 iOS 的具有相互证书的消息安全性
适用于 Android 和 iOS 设备的 Titanium Appcelerator 蓝牙模块 [关闭]