首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Random.Next() -查找Nth .Next()

Random.Next() -查找Nth .Next()
EN

Stack Overflow用户
提问于 2011-03-22 00:43:24
回答 3查看 1.5K关注 0票数 7

给出一个一贯的种子随机:

Random r = new Random(0);

调用r.Next()始终生成相同的系列;那么,是否有一种方法可以快速发现该系列中的N-值,而无需调用r.Next() N次?

我的场景是通过r.Next()创建的大量值。应用程序偶尔会在任意索引下从数组中读取一个值。我希望通过消除数组并根据需要生成值来优化内存使用。但是,强迫r.Next() 500万次模拟数组的第500万个索引比存储数组要昂贵得多。有没有可能在没有/不需要更少的循环的情况下,缩短到Nth .Next()值的方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-22 00:59:06

理论上,如果您知道确切的算法和初始状态,您就可以复制该系列,但是最终结果将与调用r.next()完全相同。

根据“好”的程度,您需要随机数字,您可以考虑基于线性同余发生器创建自己的PRNG,它相对容易/快速地为其生成数字。如果你能忍受一个“坏”的PRNG,可能还有其他的算法可以更好地用于你的目的。这是否比仅仅存储r.next()中的大量数字更快/更好是另一个问题。

票数 2
EN

Stack Overflow用户

发布于 2011-03-22 00:49:33

我不知道BCL中使用的PRNG的细节,但我猜您会发现找到一个很好的、封闭的解来解决这个系列的N值是非常困难/不可能的。

这个解决办法怎么样:

将种子发送给随机数生成器所需的索引,然后选择第一个生成的数字。这是同样的‘确定性’,并给你一个广泛的范围来玩O(1)空间。

代码语言:javascript
复制
static int GetRandomNumber(int index)
{
    return new Random(index).Next();
} 
票数 7
EN

Stack Overflow用户

发布于 2011-03-22 01:10:56

您可以构建自己的“索引”和“随机值”按需字典。这假设每次程序运行时,您总是以相同的顺序“请求”索引,或者每次运行程序时,您都不关心结果是否相同。

代码语言:javascript
复制
Random rnd = new Random(0);
Dictionary<int,int> randomNumbers = new Dictionary<int,int>();
int getRandomNumber(int index)
{
    if (!randomNumbers.ContainsKey(index))
        randomNumbers[index] = rnd.Next();
    return randomNumbers[index];
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5385459

复制
相关文章

相似问题

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