如何每次都生成一定范围内的固定“伪随机”双打列表

本文关键字:随机 伪随机 列表 何每次 范围内 | 更新日期: 2023-09-27 18:32:50

出于测试目的,我需要大约 10000 个值的固定双精度列表(对列表大小没有严格限制),大约在 -100 到 1000 范围内。此列表必须是适当的"随机",值之间没有明显的增量/乘法差异。但是,每次运行代码时,此固定列表也必须完全相同。

如果没有大量的体力劳动,我怎么能创建这样的列表?


显然,如果列表不必每次都相同,那会容易得多,我可以简单地使用Random库。如果是这种情况,即使是具有可变增量的循环yield return;,其平均增加量也像randonNum.Next(-50, 100)一样可能是合适的,但显然每次我运行代码时,这样的实现都会发生变化。

如何每次都生成一定范围内的固定“伪随机”双打列表

诀窍是在创建随机值生成器时使用种子

Random gen = new Random(1234); // or other integer seed
int size = 10000;
List<Double> result = Enumerable
  .Range(0, size)
  .Select(_ => gen.NextDouble() * 1100.0 - 100.0) // [-100..1000] range
  .ToList();

您可以使用带有种子值的 Random -构造函数生成相同的数字,例如:

var r = new Random(0);

现在您可以在其上使用r.NextInt,并且应该一次又一次地获得相同的数字。

省略种子将导致当前系统时间的默认种子,该种子保证是唯一的,因此将导致不同的结果。提供一个常量将始终创建相等的序列。