【发布时间】:2018-05-20 14:05:05
【问题描述】:
我处于需要生成具有一定随机稀疏模式的非常大(~10^16 个元素)随机矩阵的情况。显然,存储所有这些元素是完全不可行的。在任何给定时间只需要少数元素,因此可以按需绘制它们 - 但是,一旦存储了元素,以后可能需要它,并且使用相同的值很重要。即,元素不能被丢弃并随机重绘 - 一旦随机元素被绘制,就需要保存。
根据问题本身,可能有一些聪明的方法可以解决这个问题,我不会深入探讨。但是,一位同事说,应该可以根据需要使用伪随机数生成器来确定性地生成这些随机数,该生成器的种子由矩阵中的索引给出,即使用i + N*j 作为矩阵的元素(i, j),其中矩阵大小为N*N。这不会调用rand() 函数,而是使用带有特定参数的底层伪随机函数来确定性地生成先前绘制的随机值。这样就不需要保存任何数字,并且可以根据需要确定性地重新绘制它们。
我对 PRG 的理解是,对于出现随机的数字序列,您必须修复种子。上述方法有意义吗?在我看来,这就像反复重新播种 PRG 并只取第一个元素。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
你为什么不试试呢?看起来很简单。
-
这听起来很宽泛而且不清楚。对我来说最重要的问题是:你想用这个矩阵做什么?需要哪些操作(仅索引/查找;算术)?考虑通常的稀疏矩阵格式,如 lil、dok、coo、csr 和 co。它们在允许(或者我们称之为:高效)操作以及处理重复值方面是不同的。
-
您的用例非常专业,如果是我,我会设计自己的元素生成器。您的最后一段总结了这个问题:设计师希望通过在播种后获取一长串数字来使用他们的 RNG,而不是很多种子,每个种子一个数字。
-
为此使用哈希。根据矩阵索引播种随机生成器,然后获得一个随机数是一个坏主意(即使它不是第一个随机数,而是第 1000 个)。通常,随机生成器产生的数字与初始种子有很强的相关性。