随机对象是否总是包含种子,即使没有给出种子?如果可以get
这种种子?
动机: 我希望我的程序是随机的,但我希望能够随时随地重现它。我目前所做的是生成一个随机数,存储它并将其作为种子放入我用于实际程序的另一个Random对象中。这样我可以查找生成的种子,如果我想重现任何东西。
我想知道Java
和C#
的这一点,因为这些是我的主要语言,这个问题让我在两种语言中工作了几次。
答案 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对象的二进制序列化版本。这样,虽然你没有种子,你仍然可以重新生成相同的“随机”数字序列。
来源:documentation,StackOverflow 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);