给出一个一贯的种子随机:
Random r = new Random(0);
调用r.Next()始终生成相同的系列;那么,是否有一种方法可以快速发现该系列中的N-值,而无需调用r.Next() N次?
我的场景是通过r.Next()创建的大量值。应用程序偶尔会在任意索引下从数组中读取一个值。我希望通过消除数组并根据需要生成值来优化内存使用。但是,强迫r.Next() 500万次模拟数组的第500万个索引比存储数组要昂贵得多。有没有可能在没有/不需要更少的循环的情况下,缩短到Nth .Next()值的方式?
发布于 2011-03-22 00:59:06
理论上,如果您知道确切的算法和初始状态,您就可以复制该系列,但是最终结果将与调用r.next()完全相同。
根据“好”的程度,您需要随机数字,您可以考虑基于线性同余发生器创建自己的PRNG,它相对容易/快速地为其生成数字。如果你能忍受一个“坏”的PRNG,可能还有其他的算法可以更好地用于你的目的。这是否比仅仅存储r.next()中的大量数字更快/更好是另一个问题。
发布于 2011-03-22 00:49:33
我不知道BCL中使用的PRNG的细节,但我猜您会发现找到一个很好的、封闭的解来解决这个系列的N值是非常困难/不可能的。
这个解决办法怎么样:
将种子发送给随机数生成器所需的索引,然后选择第一个生成的数字。这是同样的‘确定性’,并给你一个广泛的范围来玩O(1)空间。
static int GetRandomNumber(int index)
{
return new Random(index).Next();
} 发布于 2011-03-22 01:10:56
您可以构建自己的“索引”和“随机值”按需字典。这假设每次程序运行时,您总是以相同的顺序“请求”索引,或者每次运行程序时,您都不关心结果是否相同。
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];
}https://stackoverflow.com/questions/5385459
复制相似问题