首页
社区
课程
招聘
[讨论]如何度量数组的混乱程度
发表于: 2015-6-29 22:13 14486

[讨论]如何度量数组的混乱程度

2015-6-29 22:13
14486
  密码学中常用到乱码,也离不开乱码,所以对乱码的质量有必要做深入的研究。这里只讨论如何评价数组的混乱程度。所谓乱是相对于不乱而言的,所谓不乱的数组也就是按顺序排列的数组,一般就是依大小排列的。
  这里的讨论只限于最简单的情况,也就是数组中没有相同的元素。
  混乱度h——将相邻数据间的元素数的和。
  相邻数据就是顺序排列时相差最小的数,例如5和6,1和2是相邻数,如果数组缺员的话相邻数的差也许大于1,如果数组有相同的元素时相邻的数可以是一样的。
  相邻的元素在顺序排列时它们之间没有其它元素这时混乱度h=0或者数值很小,当数组混乱时相邻元素可能距离较远h 也就大起来了。
  根据定义一个数组其完全反序的数组和原数组的混乱度是一样的。
  混乱度h是有限的,不连续的,成对出现的。  
例子:
  1)顺序排列的数组例子:0 1 2 3 4 5 7 8 9 这个数组的h=0。
  2)乱码数组的例子 4 6 2 5 1 3 这数组的 h=10 按定义计算如下
  1和2之间有1个元素
  2和3之间有2个元素
  3和4之间有4个元素
  4和5之间有2个元素
  5和6之间有1个元素
  所以说这个数组偏离顺序的混乱度为10。利用编程很容易用循环和判断得出结果。
  为简单起见,这里举例的数组都是连续的,最简单的应用就是用于评价洗牌质量,例如13张同花色的不同扑克牌,洗牌后混乱程度如何?
  我们可见,数组可能有的排列状态共 13!= 6227020800,h=0的数组只有两个,拿到的概率为2/13!很小是很难出现的,h的最大值是71;如果随机洗牌h在40和50出现的概率最大,可以说h=20以下就是牌洗得很差了。
  各种h出现的概率,都是可以测算的,但具体数值没有什么实际用处,只要数组的h归一化后达到60%以上就可以认为混乱程度足够了,实际并不是越大越好,足够大后效果是一样的。
下面是模拟13张牌的排列图示及其混乱度h






走向实用:
  这里是对最小单元数组进行测量,得到一些数据例如混乱度的极值等,然后就可以用这个东西来测量混乱度了,将排好的最小单元数组放在,用构造法造随机数组的原始数组之间的不同位置,在同时进行随机排序时就可以衡量数据的混乱度了,通过检测各个单元数组的分数来了解整个数组的混乱度。
  因为最小单元数组可能不同,混乱度的数值的最大值都不一样,为了使用更方便,可以对混乱度的数值归一化,例如用当前的h值除以h的最大值再乘以100,这样h值就在0和100之间了。
  

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
diff, dft, mean/stdev.
2015-6-30 09:32
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
一般的方法:熵、相关性和数理统计。
建议楼主多积累点数学基础再来创新。
2015-6-30 10:11
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
欢迎讨论,但说些空洞的东西毫无价值。
没能找到有用的相关资料,否则费这事干吗?
数组的混乱程度是客观存在的东西,是可以通过数组的结构计算出结论的。要是还需要借助统计或概率分析来完成一些计算是否还有应用上的意义,这里不想作理论研究而只是提出一种有效的实用方法。
2015-6-30 13:56
0
雪    币: 102
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
默认刚买回来的一套扑克,认为h=0
取原来第2n-1张放第n,原来第2n放到数第n (n=1~26)
[就像(1 2 3 4 5 6)-->(1 3 5 6 4 2)]
h显著增大,但牌洗得并不好(发牌,发两堆看看...)
如果是扑克的话,花色,点数(对13,4的商,余数)还是很重要的不仅编号的大小而已
2015-6-30 16:42
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
这种东西首先定义要完善,逻辑上不要出现漏洞。然后就是数据说话了。像楼上说的1 3 5 6 4 2这也是规律性很强的排列当然不能算是洗得好的。实际一副扑克洗得好坏是个复杂的问题,你首先要定义各种花色及大小王的权重,也就是定义了完全顺序排列的形态,你才能度量偏离这一形态的混乱程度....。
2015-7-1 10:35
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
仔细想了一下,楼主的方法,本质上是使用正态分布判定随机性。
其实对于离散数据的情况,使用卡方分布效果会好些。
2015-7-2 11:45
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
欢迎讨论,能说说具体怎么根据数组计算出数组的混程乱度吗?
2015-7-3 12:06
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
一楼提出用误差理论来计算数组的混乱程度。感觉完全是驴唇不对马嘴,实验数据的误差与排列次序无关,不能胡乱套用。
2015-7-4 15:11
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
混乱,只是相对于某个定义好的“有序”标准而言的。
你先定好什么是有序,然后才能确定什么是混乱。

---
如果只是让别人猜不到 数据的规律,那就用 真随机数生成器。
2015-7-4 15:43
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
拿麻将来举例,
13张牌: 147条,258筒,369万,西西,中中

这副听没听呢?
这得看用什么标准。
用日本麻将的规则,这是副乱牌,未听。(混乱)
按 国标麻将,这是副 大牌,主番是 组合龙 + 5门齐,听 西、中。(有序)
2015-7-4 15:52
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
  数组的混乱比牌类游戏的洗牌混乱单纯的多,数组的有序就是相对于元素大小的排列,而数组的混乱就是相对于有序排列的混乱。只有将数组的混乱问题处理清晰了,才好去处理诸如洗牌质量等问题。
2015-7-5 09:27
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你再看看 10 楼。
你先明确的定义什么是“有序”的标准,
然后才能度量“混乱”的程度。

不要把 随机排列 和 混乱 2个不同的概念混淆了。

你的洗牌数组里的数据,即使是“混乱”的,但不一定是 随机 的。
因为别人有可能“猜” 到此数据的组合规律。
2015-7-5 11:18
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
  所谓混乱度是对数组的一种客观评价,对任何数组都可以评价其偏离有序排列的程度,不管是采自自然的物理量,或是人为编排的,随机不随机是无所谓的。
  而数组本身就有其唯一的有序排列对。
例如我们有几个简单的元素构成数组,所有成员是 2 3 3 3 1 5 5 9 7
其有序排列只有 1 2 3 3 3 5 5 7 9 和 9 7 5 5 3 3 3 2 1  
而混乱度就是相对于有序排列的。
2015-7-5 12:38
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
例如我们有几个简单的元素构成数组,所有成员是 2 3 3 3 1 5 5 9 7
其有序排列只有 1 2 3 3 3 5 5 7 9 和 9 7 5 5 3 3 3 2 1  

============
这样就简单了啊

用个 冒泡排序 就可以了。记录排序时发生交换的次数。
次数越多就 越混乱呗。
正序、反序都做一次,结果相加再除以2,最后均值结果越大就越乱。
2015-7-5 12:52
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
  冒泡排序是最先考虑的,但并不理想,冒泡次数最多的不一定是最混乱的。所以方法被淘汰了。
2015-7-5 16:34
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
  利用排序的循环次数来度量数组的混乱程度是最先尝试的方法之一,可惜这个方法没有成功。一个反例就能打倒它,例如排序交换次数最多的情况不是看起来很乱的排序,规律性很强的序列也能交换次数很多,例如那种大小相间的排序(偶数位从小到大,奇数位从大到小)。例外一个完全的规律性数组,去和反向排序次数去平均,在逻辑上也很别扭,显示出此方法的不靠谱。
  混乱度的数值应该从其大小上真实的反应出数组的乱象,一个完全的规律性数组应该是零值才合乎逻辑。
2016-1-31 00:20
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
18
  质疑“混乱度h——相同或相邻数据间的其它元素数的和。”
  其它元素数的和,元素的值有大有小对混乱的影响是不一样的,所以用元素数的和来度量是太粗糙了,而用元素值与当前值的差的和来度量就好多了。
  欢迎继续讨论。直到找到一种实用的混乱度的量化值。
2016-2-1 11:26
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
网上搜“随机数检测规范”,然后仔细研究一下。

正文部分看不懂的话,建议看看附录,里面有你想要的。
2016-2-2 11:01
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
20
楼上是说NIST吧。那东西表面看起来考虑的很周全,实际上很垃圾,你可以自己试试,你就是用常数数组也就是元素都一样的数组去测试,那15项玩意里也有能测试通过的项目,你不能从测试数据上判别,性能很差的C语言的rand()函数和比较不错的随机函数例如MT19937之间的优劣。整个一个大废物....
2016-2-2 14:22
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
我用过相关测试软件,也按其标准独立写过随机数测试软件,没有觉得是“垃圾”。

“你就是用常数数组也就是元素都一样的数组去测试,那15项玩意里也有能测试通过的项目”你自己对它都不明不白,妄加评论只会误导他人。
2016-2-25 14:01
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
22
一套所谓的标准有没有价值是看其有没有用处,对于NIST我是那样看,那东西对楼上也许是宝贝...
哪怕是能区分出优质的或劣质的伪随机数我也认为其有点价值,可是它不能...
本是舶来之物却拿来当国家标准类的东西,也不知怎么论证的?
2016-2-25 23:05
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
有空时我会尽力写一个随机数检测的通俗解读。
要完全理解随机数检测,确实不是一件容易事。随机数检测规范如果详细展开,足以成为一本专著。
2016-2-26 10:11
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
24
  继续讨论,前面关于数组混乱度的定义,是想得到一个数组混乱度的量化表示,而且只限于描述一个单元数组。但由于定义过于简单容易找到悖论。根据定义相邻元素之间的其它与相邻中最小的一个的差的绝对值的和就是混乱度的数值,根据定义可以这样找到混乱度的最大值,元素从小到大这样排列,从外向里排列,第一个是最小的元素老一,最后是老二,老三在老一后面,老四在老二前面,依次类推,从定义可知这样将得到最大的混乱度数值,但是可以看到排出的数组是规律性很强的东西(三角形),而不是最混乱的数组,所以定义是失败的。
  这种定义唯一的好处是,正序和反序数组混乱度的数值都是零。继续努力看看能找到更好的定义和计算方式吗?
2016-2-26 22:55
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主的定义其实就是逆序数,比如:3521, 3后面比3小的数为2,1两个,5后面为2,1两个,2后面为1一个,逆序数为5.然后取反向的逆序数,比3大的为5一个,后面就都是0,逆序数为1,然后取最小值就行了。
2016-3-4 22:20
0
游客
登录 | 注册 方可回帖
返回
//