适用于 iOS 和 Android 的随机数生成器

Posted

技术标签:

【中文标题】适用于 iOS 和 Android 的随机数生成器【英文标题】:Random Number Generator for iOS and Android 【发布时间】:2016-05-06 18:59:48 【问题描述】:

我正在为 androidios 构建一个应用程序。在应用程序中,我需要生成在 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 蓝牙模块 [关闭]

适用于 Android 和 iOS 的跨平台开发

适用于 Android 和 IOS 的 HighChart 库 [关闭]

适用于 Android 和 iOS 的不同软件包版本