我有一个使用随机数生成其输出的函数。我希望能够用长字符串播种这些随机数;只要字符串相同,随机数序列就会相同。这主要用于测试目的,也用于重复性。
我打算创建一个包装类,其作用类似于内置的System.Random类,其构造函数类似于:
MyRandom mr = new MyRandom(100, "This is a really long string...");
这会生成一个内部数字列表,这样当调用mr.Next()时,它只返回列表中的下一个条目。当它达到100时,列表只是包装。我希望能够调用.NextDouble()。这并不意味着任何高性能,我只是希望能够生成随机列表并再次使用它。
如何将长字符串转换为随机数字列表。我已经考虑过用字符串的长度和潜水数n(在这种情况下为100)。然后细分字符串并在每个段上调用哈希。
这是一种合理的方法吗?还是有另一种更好的方法?
答案 0 :(得分:6)
听起来有点奇怪。你在寻找这样的东西吗?
Random rnd = new Random("Your string".GetHashCode());
Console.WriteLine(rnd.Next());
这将始终生成相同的随机数序列,因为您实际上是使用字符串播种,而哈希码对于相同的字符串将始终保持相同。
答案 1 :(得分:5)
初始化Random
并不需要长输入,因此它会生成相同的随机值序列(对于相同的调用序列)。如果你只使用整数作为参数,那么Random
将使用整数初始化其内部状态(称为 seed ),并且随机生成的数字序列将始终相同(对于相同的种子)。
Random
constructor at MSDN 如果您出于某种原因想使用Random
值初始化string
,那么您可以使用new Random(str.GetHashCode())
。
答案 2 :(得分:1)
这是我在重新启动过程中确定性的方法:
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);
}
答案 3 :(得分:0)
为什么不使用字符串的哈希码为随机数生成器播种,并像普通的那样使用它?