获取随机对象的种子而不传递种子

本文关键字:种子 获取 对象 随机 | 更新日期: 2023-09-27 18:08:49

随机对象是否总是包含种子,即使没有给定种子?如果是这样,是否有可能将这颗种子get ?

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

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

获取随机对象的种子而不传递种子

如果您不为随机构造函数提供一个Seed,则将隐式地为您生成Seed。要设置一个种子并在代码的其他地方再次使用它或复制任何东西,请尝试:

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

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

初始化Random类的新实例,使用与时间相关的默认种子值

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

再一次,看看文档,你会发现如果你不提供它,你就找不到使用的种子。

对于希望能够一致地产生随机数,您可以创建一个IRandomNumberGenerator接口并创建2个实现。一个将调用Random类,另一个可用于测试目的,并将简单地返回您想要的任何内容。然后你可以使用依赖注入来控制使用哪个实现。

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

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

来源:文档,StackOverflow问题。

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

在。net框架中,调用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);