我有一个函数,它使用随机数来生成其输出。我希望能够用一个长字符串来播种这些随机数;只要字符串是相同的,随机数序列就是相同的。这主要是为了测试目的,但也是为了可重复性。
我计划创建一个包装类,它的作用类似于内置的System.Random类,其构造函数类似于:
MyRandom mr = new MyRandom(100, "This is a really long string...");这将生成一个内部数字列表,因此当调用mr.Next()时,它只返回列表中的下一个条目。当它达到100个时,这个列表就会自动换行。我也希望能够调用.NextDouble()。这并不意味着什么高性能,我只是想能够生成一个随机列表,并再次使用它。
如何将长字符串转换为随机数字列表。我已经考虑过取字符串的长度,并按数字n(在本例中为100)进行跳跃。然后对字符串进行细分,并在每个段上调用散列。
这是一种合理的方法,还是有其他更好的方法?
发布于 2010-10-14 07:37:34
您实际上不需要很长的输入来初始化Random,这样它就会生成相同的随机值序列(对于相同的调用序列)。如果只使用integer作为参数,那么Random将使用integer初始化其内部状态(称为seed),随机生成的数字序列将始终相同(对于同一seed)。
有关详细信息,请参阅overloaded Random constructor at MSDN
如果出于某种原因,您希望使用string值初始化Random,那么您可以只使用new Random(str.GetHashCode())。
发布于 2010-10-14 07:41:56
听起来有点奇怪。你在找这样的东西吗?
Random rnd = new Random("Your string".GetHashCode());
Console.WriteLine(rnd.Next());这将始终生成相同的随机数序列,因为您实际上是在使用字符串进行播种,而散列代码对于同一字符串将始终保持相同。
发布于 2020-11-06 18:07:18
下面是我如何在进程重新启动时使其具有确定性:
private static Random GetRNG(string seed) {
using var algo = SHA1.Create();
var hash = BitConverter.ToInt32(algo.ComputeHash(Encoding.UTF8.GetBytes(seed)));
return new Random(hash);
}https://stackoverflow.com/questions/3928906
复制相似问题