概述
在被立即标记为重复之前,我对测试Fisher-Yates的随机性不感兴趣,因为这可以通过测试底层的RNG来完成。我对测试产生随机排列的函数的质量很感兴趣。
如何测试随机洗牌函数的质量,而我不知道其中的基本实现?
为了更具体地解释我的难题,我目前正在尝试实现来自这篇博客文章的置换算法的64位版本。
TLDR:您可以使用一个哈希函数,该函数对于给定的大小为2的幂域是可逆的,通过将范围舍入到下一个2的幂,并排除和生成小于范围的索引,从而生成随机排列。
我想出了一个讨厌的解决方案,但我不确定是否有更好的解决方案,以及如何计算该解决方案引入的偏差:
在计算随机排列时想到的一件事是,如果我们对包含连续整数的数组进行洗牌,并将第一个索引作为随机生成的数字使用,现在可以使用像PractRand这样的测试套件来测试其随机性。
这种方法有一个明显的问题,因为我们感兴趣的是单个排列的相关性,而不是不同排列之间的相关性,因为在上述算法中,初始指数总是适当随机的。
现在,下一个想法是使用第一个k
索引作为随机数,但这也有一个问题,因为一旦生成一个数字,它就不会再次发生。
通过在数组中多次存储连续整数,可以在一定程度上提升此值。因此,[0,n]
中的每个整数都存储在数组中的m
时间中,并使用k
混合整数进行测试。随着m
的增加,获得重复整数的偏差会下降,因此这是一个理论上有用的解。
不过,这需要大量内存,但幸运的是,我感兴趣的算法一次生成一个随机索引,因此通过使用生成的索引的mod n
可以非常有效地完成这一任务。
编辑:为了在更小的范围内澄清我在说什么:假设我有一个包含m
零和m
1的数组(所以是n=1
)。现在我对数组进行洗牌,并将第一个k
零和1作为位写入到PractRand这样的测试套件中,然后重复这个过程。对于非常大的m
(如2^50
)和较小的k
(例如2^8
),重复的偏差应该非常小,因此可以忽略不计。
我不知道k
,n
和m
的选择值是什么,以及相应的偏差是什么。
k
、n
和m
值的偏差?发布于 2021-04-05 10:45:46
在计算随机排列时想到的一件事是,如果我们对包含连续整数的数组进行洗牌,并将第一个索引作为随机生成的数字使用,现在可以使用像
PractRand
这样的测试套件来测试其随机性。
不,你不能这么做,但差不多了。伪随机序列具有多个相同的值、重复数和+/-位数。即使在完全配置的情况下,您的单独增量序列也很容易通过测试,甚至可能会失败像ent
这样简单的东西。
通过推理测试洗牌算法。
/dev/urandom
或windows等效的地方生成一个大文件。检验假设是,由于原始序列是密码随机的,并且有正确的\chi^2分布,适当的洗牌不会使它变得更糟。它会将这些值空间成随机位置。因此,标准的随机性测试应该通过它。
https://crypto.stackexchange.com/questions/89198
复制相似问题