从字符串生成随机序列

时间:2010-10-13 23:35:55

标签: c# random

我有一个使用随机数生成其输出的函数。我希望能够用长字符串播种这些随机数;只要字符串相同,随机数序列就会相同。这主要用于测试目的,也用于重复性。

我打算创建一个包装类,其作用类似于内置的System.Random类,其构造函数类似于:

MyRandom mr = new MyRandom(100, "This is a really long string...");

这会生成一个内部数字列表,这样当调用mr.Next()时,它只返回列表中的下一个条目。当它达到100时,列表只是包装。我希望能够调用.NextDouble()。这并不意味着任何高性能,我只是希望能够生成随机列表并再次使用它。

如何将长字符串转换为随机数字列表。我已经考虑过用字符串的长度和潜水数n(在这种情况下为100)。然后细分字符串并在每个段上调用哈希。

这是一种合理的方法吗?还是有另一种更好的方法?

4 个答案:

答案 0 :(得分:6)

听起来有点奇怪。你在寻找这样的东西吗?

Random rnd = new Random("Your string".GetHashCode());
Console.WriteLine(rnd.Next());

这将始终生成相同的随机数序列,因为您实际上是使用字符串播种,而哈希码对于相同的字符串将始终保持相同。

答案 1 :(得分:5)

初始化Random并不需要长输入,因此它会生成相同的随机值序列(对于相同的调用序列)。如果你只使用整数作为参数,那么Random将使用整数初始化其内部状态(称为 seed ),并且随机生成的数字序列将始终相同(对于相同的种子)。

如果您出于某种原因想使用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)

为什么不使用字符串的哈希码为随机数生成器播种,并像普通的那样使用它?