0

所以我有一些 C 代码,它根据 srand() 生成的数字计算一些结果。如果我使用相同的种子编号,结果将始终相同。

现在我有一个 Android 应用程序通过 JNI 加载这些 C 代码。然而,尽管使用相同的种子编号,结果却变得不同。我已经仔细检查了种子编号以确保它是相同的。但是,由于 Android 程序和本机代码都非常复杂,我很难弄清楚是什么导致了这个问题。

我可以肯定的是,我们没有使用 java 程序中的函数来生成随机数。所以大概 srand() 不是每次都用不同的种子号调用。Java 或 C 中的其他函数可以更改 srand() 生成的随机数吗?

谢谢!

更新:我想我的问题有点令人困惑。澄清一下,我比较的结果来自同一个平台,但运行不同。c 代码使用 rand() 来获取一个数字,并据此计算结果。因此,如果 srand() 的种子数始终相同,则 rand() 获得的数字应该相同,因此结果应该相同。但不知何故,即使我为 srand() 使用相同的种子,rand() 给了我不同的数字......对此有什么想法吗?

4

2 回答 2

2

有许多不同类型的随机数生成器,并且不能保证它们在平台之间都是相同的。如果您的项目需要一个跨平台的 100% 可预测的解决方案,那么您可能必须编写自己的解决方案。

它真的没有听起来那么糟糕......

我建议查找随机数生成,例如Mersenne Twister算法(这是我在项目中使用的),并编写一小段代码,您可以在所有项目中共享。这也为您提供了能够拥有多个具有不同种子的生成器的好处,这对于益智游戏之类的东西非常有用,在这种游戏中,您可能需要基于特定种子的可预测随机集合来生成您的谜题,但是另一个时钟用于随机化特殊 FX 或其他游戏元素的种子生成器。

于 2013-08-08T02:10:20.603 回答
0

rand() 实现的伪随机算法由 C 库决定,没有标准算法。您绝对不能保证从一个实现到下一个实现获得相同的数字序列,并且听起来 Android 实现与您的开发环境不同。如果您需要跨平台的可预测序列,您应该实现自己的随机数生成器。

于 2013-08-08T02:08:32.597 回答