从字符串生成随机序列

3

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

我计划创建一个包装类,像内置的System.Random类一样工作,构造函数类似于:

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

这将生成一个内部数字列表,因此当调用mr.Next()时,它只返回列表中的下一个条目。 当到达100时,列表会重新开始。 我想能够调用.NextDouble()。这不是为了高性能,我只想能够生成一个随机列表并再次使用它。
如何将长字符串转换为随机数列表。我考虑将字符串长度除以n(在本例中为100)。然后将字符串细分并对每个段调用哈希。
这种方法合理吗?还是有另一种更好的方法?
4个回答

8
听起来有些奇怪。你是在寻找类似于这样的东西吗?
Random rnd = new Random("Your string".GetHashCode());
Console.WriteLine(rnd.Next());

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


8
GetHashCode() 方法并不总是返回相同的数字。如果重新启动应用程序,该值可能会发生变化。 - jasdefer

7
你不需要一个很长的输入来初始化Random,使其生成相同序列的随机值(对于相同的调用序列)。如果您只使用整数作为参数,则Random将使用该整数初始化其内部状态(称为种子),生成的随机数序列将始终相同(对于相同的种子)。 如果您想要使用字符串值初始化Random,出于某种原因,那么您可以使用new Random(str.GetHashCode())

2
“GetHashCode” 不能保证在进程重新启动后返回相同的结果。 - João Bragança

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);
}

-2
为什么不使用字符串的哈希码来初始化随机数生成器,并像平常一样使用它呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接