首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串生成随机序列

从字符串生成随机序列
EN

Stack Overflow用户
提问于 2010-10-14 07:35:55
回答 4查看 6.1K关注 0票数 3

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

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

代码语言:javascript
复制
MyRandom mr = new MyRandom(100, "This is a really long string...");

这将生成一个内部数字列表,因此当调用mr.Next()时,它只返回列表中的下一个条目。当它达到100个时,这个列表就会自动换行。我也希望能够调用.NextDouble()。这并不意味着什么高性能,我只是想能够生成一个随机列表,并再次使用它。

如何将长字符串转换为随机数字列表。我已经考虑过取字符串的长度,并按数字n(在本例中为100)进行跳跃。然后对字符串进行细分,并在每个段上调用散列。

这是一种合理的方法,还是有其他更好的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-14 07:37:34

您实际上不需要很长的输入来初始化Random,这样它就会生成相同的随机值序列(对于相同的调用序列)。如果只使用integer作为参数,那么Random将使用integer初始化其内部状态(称为seed),随机生成的数字序列将始终相同(对于同一seed)。

有关详细信息,请参阅overloaded Random constructor at MSDN

如果出于某种原因,您希望使用string值初始化Random,那么您可以只使用new Random(str.GetHashCode())

票数 7
EN

Stack Overflow用户

发布于 2010-10-14 07:41:56

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

代码语言:javascript
复制
Random rnd = new Random("Your string".GetHashCode());
Console.WriteLine(rnd.Next());

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

票数 7
EN

Stack Overflow用户

发布于 2020-11-06 18:07:18

下面是我如何在进程重新启动时使其具有确定性:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3928906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档