首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检验在没有费舍-耶茨的情况下产生的随机排列的随机性?

检验在没有费舍-耶茨的情况下产生的随机排列的随机性?
EN

Cryptography用户
提问于 2021-04-05 10:32:27
回答 1查看 148关注 0票数 1

问题

概述

在被立即标记为重复之前,我对测试Fisher-Yates的随机性不感兴趣,因为这可以通过测试底层的RNG来完成。我对测试产生随机排列的函数的质量很感兴趣。

如何测试随机洗牌函数的质量,而我不知道其中的基本实现?

我的具体问题

为了更具体地解释我的难题,我目前正在尝试实现来自这篇博客文章的置换算法的64位版本。

TLDR:您可以使用一个哈希函数,该函数对于给定的大小为2的幂域是可逆的,通过将范围舍入到下一个2的幂,并排除和生成小于范围的索引,从而生成随机排列。

A hacky解决方案

我想出了一个讨厌的解决方案,但我不确定是否有更好的解决方案,以及如何计算该解决方案引入的偏差:

在计算随机排列时想到的一件事是,如果我们对包含连续整数的数组进行洗牌,并将第一个索引作为随机生成的数字使用,现在可以使用像PractRand这样的测试套件来测试其随机性。

这种方法有一个明显的问题,因为我们感兴趣的是单个排列的相关性,而不是不同排列之间的相关性,因为在上述算法中,初始指数总是适当随机的。

现在,下一个想法是使用第一个k索引作为随机数,但这也有一个问题,因为一旦生成一个数字,它就不会再次发生。

通过在数组中多次存储连续整数,可以在一定程度上提升此值。因此,[0,n]中的每个整数都存储在数组中的m时间中,并使用k混合整数进行测试。随着m的增加,获得重复整数的偏差会下降,因此这是一个理论上有用的解。

不过,这需要大量内存,但幸运的是,我感兴趣的算法一次生成一个随机索引,因此通过使用生成的索引的mod n可以非常有效地完成这一任务。

编辑:为了在更小的范围内澄清我在说什么:假设我有一个包含m零和m 1的数组(所以是n=1)。现在我对数组进行洗牌,并将第一个k零和1作为位写入到PractRand这样的测试套件中,然后重复这个过程。对于非常大的m (如2^50)和较小的k (例如2^8),重复的偏差应该非常小,因此可以忽略不计。

我不知道knm的选择值是什么,以及相应的偏差是什么。

问题

  1. 在不知道函数的底层实现的情况下,是否还有其他方法来测试函数,而不是对数组的随机性进行调整?
  2. 我提议的方法有什么问题吗?
  3. 如何计算我的方法对给定的knm值的偏差?
EN

回答 1

Cryptography用户

回答已采纳

发布于 2021-04-05 10:45:46

在计算随机排列时想到的一件事是,如果我们对包含连续整数的数组进行洗牌,并将第一个索引作为随机生成的数字使用,现在可以使用像PractRand这样的测试套件来测试其随机性。

不,你不能这么做,但差不多了。伪随机序列具有多个相同的值、重复数和+/-位数。即使在完全配置的情况下,您的单独增量序列也很容易通过测试,甚至可能会失败像ent这样简单的东西。

通过推理测试洗牌算法。

  1. 从类似/dev/urandom或windows等效的地方生成一个大文件。
  2. 把它按顺序排序,无论是上升还是下降。
  3. 那就别说了。
  4. 然后测试随机性。

检验假设是,由于原始序列是密码随机的,并且有正确的\chi^2分布,适当的洗牌不会使它变得更糟。它会将这些值空间成随机位置。因此,标准的随机性测试应该通过它。

票数 1
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/89198

复制
相关文章

相似问题

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