【问题标题】:Producing same random numbers in c++ and .NET在 C++ 和 .NET 中生成相同的随机数
【发布时间】:2013-12-22 12:38:11
【问题描述】:

我必须将一个 c++ 程序移植到 C#。

程序中涉及随机数。我必须在两个程序中产生完全相同的随机数才能在测试中获得相同的结果。

在 C++ 中我使用

srand(1000)
...
double r = (double)rand() / (double)(RAND_MAX);

在 C# 中我使用

private readonly Random _rnd = new Random(1000);
...
_rnd.NextDouble()

但是,尽管种子相同,但程序会产生不同的数字。有没有办法产生相同的随机数?

【问题讨论】:

  • “相同的随机数”。可能有点矛盾?
  • 我会在<random> 打赌,尤其是梅森捻线机。我也打赌 C# 说明你需要寻找什么。

标签: c# c++ .net random random-seed


【解决方案1】:

你知道,c++ rand 和c# Random 类使用什么算法?

您可以尝试自己实现一些PNG。例如。 LCG 算法非常简单,可以在两种语言中轻松实现...只需使用 wiki 页面中的一些常用参数即可。

【讨论】:

  • 确实如此,但很多工作他只需要“测试”,不是吗?我认为我们需要更多的上下文来理解他为什么总是想要相同的输出。我认为它是用于测试的,但如果它是基本的,那么推出你自己的确实是一个好主意。或者也许使用 P/Invoke 到一个调用 srand..的 c/c++ 库。
  • class CRandom { unsigned int m_seed; CRandom(int seed){ m_seed = seed;} unsigned int Next(){ m_seed = 1664525 * m_seed + 1013904223; return m_seed;} }; 在我看来这不是太多的工作......
  • 是的,yves 是对的。实施其他一些事情对我来说将是负担。
【解决方案2】:

本质上,两个随机函数(srand 与 Random)都有不同的底层实现,因此您不能依赖它们提供相同的输出。那么,为什么不提供一组“n”数字并将它们输入到您的 c++ 和 c# 算法中——当然只是为了测试目的?这样,您始终可以确定您将拥有相同的数量、相同的数量和相同的订单。

例如:每行都有一些数字的文件,然后在 c++/c# 中读出它,然后将这些数字输入到您尝试“测试”的算法中。

(另外,您想在这里测试什么?您编写的算法(因此是移植算法),或者两种语言的“随机”功能? 因为,根据您对我上述问题的回答,与您的案例相关的答案可能会有很大差异!那么您能否为我们提供更多背景信息?)

【讨论】:

  • 这是我的逃生计划。如果我找不到任何其他解决方案,我将创建一个包含随机数序列的文件,并在两个程序中都使用它。
  • 我使用随机数来分配粒子的速度。这些粒子在彼此和墙壁之间发生碰撞。因此,如果初始速度不同,系统的最终状态也会不同。
  • 感谢您提供的上下文。但是,如果它只是一次性的事情(用于测试),您可以接受我的建议,但如果 c 和 .net 端口在结构上始终需要它,那么我会说使用 @V-X 的答案/建议。
【解决方案3】:

我用过这个

Random rnd = new Random();

作为我的声明。

还有这个:

Convert.ToString(rnd.Next(1, 49))

当按下按钮时执行。

也许您可以对此有所帮助。

问候

【讨论】:

  • 但这不会产生与 srand 等价物相同的输出,不是吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2017-07-30
  • 1970-01-01
  • 2016-02-20
  • 2015-09-27
相关资源
最近更新 更多