获取Random对象的种子而不传入种子?

时间:2014-06-14 15:39:56

标签: java c# random

随机对象是否总是包含种子,即使没有给出种子?如果可以get这种种子?

动机: 我希望我的程序是随机的,但我希望能够随时随地重现它。我目前所做的是生成一个随机数,存储它并将其作为种子放入我用于实际程序的另一个Random对象中。这样我可以查找生成的种子,如果我想重现任何东西。

我想知道JavaC#的这一点,因为这些是我的主要语言,这个问题让我在两种语言中工作了几次。

4 个答案:

答案 0 :(得分:3)

如果您没有为随机构造函数提供种子,则会隐式生成种子。要设置种子并在代码中的其他位置再次使用它或重现任何内容,请尝试以下操作:

long seed = System.currentTimeMillis();
Random rand = new Random(seed);
System.out.println(seed);

答案 1 :(得分:2)

要从C#角度回答您的第一个问题,请查看文档 - MSDN。对于Random类无参数构造函数,它说:

  

使用与时间相关的默认种子值

初始化Random类的新实例

所以是的,如果你不提供种子,运行时将使用默认的种子。

再次,查看您可以看到的文档,如果您不提供种子,则无法找到所使用的种子。

至于希望能够始终如一地生成随机数,您可以创建IRandomNumberGenerator接口并创建2个实现。一个人可以调用Random类,另一个可以用于测试目的,只需返回你想要的任何内容。然后,您可以使用依赖注入来控制使用哪个实现。

答案 2 :(得分:1)

至于C#,没有简单的方法从已经初始化的对象中获取种子。做你想做的最好的方法就是按照你已经做的方式去做(生成种子,保存它,然后在新的Random对象中使用它)。

其他可能性是在其(隐式)初始化之后保存Random对象的二进制序列化版本。这样,虽然你没有种子,你仍然可以重新生成相同的“随机”数字序列。

来源:documentationStackOverflow question

老实说,我非常怀疑Java有办法做到这一点,因为它(至少在我看来是这样)是一种安全漏洞。

答案 3 :(得分:1)

在.NET Framework中,调用Random()构造函数等同于调用Randoom(Environment.TickCount)。因此,您可以自己阅读(并存储)Environment.TickCount,然后根据该值初始化Random(int)来满足您的要求。

因此,而不是呼叫:

Random myRandom = new Random();

您可以使用:

int seed = Environment.TickCount;
// optionally store seed for later reuse
Random myRandom = new Random(seed);