我正在开发一个具有多种功能的项目。我多次调用一个伪随机数,每次调用不同的函数,然后对其进行一些数学运算。例如:
f(i,j)*random(i,j)
我假设在不同的函数中,伪随机数不等于给定 i 和 j 的另一个函数中的伪随机数。这是一个正确的假设吗?如果是这样,怎么可能改变呢?
如果重要的话,我使用的语言是 Xojo,它类似于 VB6。
我正在开发一个具有多种功能的项目。我多次调用一个伪随机数,每次调用不同的函数,然后对其进行一些数学运算。例如:
f(i,j)*random(i,j)
我假设在不同的函数中,伪随机数不等于给定 i 和 j 的另一个函数中的伪随机数。这是一个正确的假设吗?如果是这样,怎么可能改变呢?
如果重要的话,我使用的语言是 Xojo,它类似于 VB6。
我不太确定问题是什么,但希望提供一些伪随机数生成器(PRNG)的基础知识会回答这个问题:
这更多是一种语言特性,但通常调用相同的函数(即random
)与您从哪里调用它无关(可能还有其他决定因素)。
random(i,j)
可能会或可能不会连续两次或一段时间后返回相同的数字。这是(伪)随机的,我们只是不知道它是否会。
如果您想random(i,j)
始终返回相同的值,您可以考虑编写自己的函数,使用某个公式将i
和的某个值映射到另一个值,或者您可以将所有先前生成的数字存储在 a中,如果存在则简单地返回该值。j
map
如果您不想random(i,j)
返回相同的值,请考虑从 to 生成数字并将i
它们j
打乱,然后简单地重复返回列表中的下一个值。
您通常可以设置 PRNG 的种子。这将导致,如果您在将种子设置为某个值后获得某个序列,如果您在其他时间将种子设置为相同的值,您将获得相同的序列。除了让您能够准确地重现以前的结果之外,这并没有真正起到太大的实际用途(我能想到的)。
如果您想random(i,j)
在每次调用时都返回相同的随机数,i,j
您可以简单地保存状态。
一种方法是将状态存储在n x n
矩阵中R
(其中n
的范围是i,j
)。在第一次调用random(i,j)
set R(i,j) = rand()
。在后续调用中检索现有值。
如果 的范围i,j
非常大并且值稀疏,则使用哈希表R
代替矩阵。