文章目录
一、实验要求
二、实验条件
三、实验目的
可以通过统计每个阶段生成的伪随机数均值来验证伪随机数是否理想
若S1串位256位均值应该在128附近
四、步骤
第一步:生成256比特位的串
1、随机生成x,y迭代的初始值(仅有此处和,x,y迭代值为0时可以用内置的随机函数,不然也就不用我们设计算法了,直接调包就好了)
2、计算x,y第1次迭代值,判断x,y是否为0,为0则随机化x,y(0为该映射的不动点,不随机化处理x,y始终为0)
3、此时迭代值x、y在-1 ~ 1之间,将迭代值扩大并对4取余赋给s_db,此时s_db的值在0~3之间,也就是2个比特位,s_db(1)与s_db(2)的二进制表示:00、01、10、11,将s_db的值作为索引区Array中取它们对应的海明距离,然后存入HM_Dis
4、每一次循环我们能够得到2个比特位,于是128次循环就能得到1个256比特位的S串,所以需要n个S串就循环n*128次
第二步:验证伪随机数是否理想
第一步完成后我们拿到了每一个块的海明距离数组,现在我们要计算每一个串的海明距离
一个串由128个块构成,于是我们将块的海明距离数组进行切片,每次拿出128块组成一个256比特串,直至切分完毕
最后计算均值即可
五、思路
假设要生成的S串长度为256
S1:256bit
S2:256bit
海明距离:对应比特位相同则为0,不同则为1
举例:
s1=3对应二进制为:11
s2=0对应二进制为:00
s1与s2的对应二进制位第1位不同距离加1,第二位也不同距离加1,总共距离就是2
s1=1对应二进制为:01
s2=2对应二进制为:10
s1与s2的对应二进制位第1位不同距离加1,第二位也不同距离加1,总共距离就是2
可以看到海明距离的计算只与相对应二进制位相关
举例说明:
s1=14对应二进制为:11 10
s2=4对应二进制为: 01 00
s1与s2的海明距离可以拆分为 11与01的海明距离+10与00的海明距离
所以S1与S2的海明距离就能拆分为128个块的海明距离
块的构成:
[s1, s2] ',s1、s2都是2比特位,s1是S1的块,s2是S2的块
若我们要生成100对S1和S2,那么就等价于生成100 * 128 对[s1, s2] ’
若我们要计算S1和S2的海明距离,那么就等价于计算128对 [s1, s2] '的海明距离之和
生成一对S1、S2的任务可以转化为生成128对 [s1, s2] ’
s1、s2都是2比特位,在十进制中就是0 ~ 3,x、y每次迭代的值在-1 ~ 1之间所以需要对x、y的迭代值进行处理并映射到0 ~ 3
处理解释,先将迭代值放大,然后取整,最后mod 4,就能将x、y映射到0 ~ 3
将x的映射值的二进制形式赋予s1,将y的映射值的二进制形式赋予s2,再计算s1、s2的海明距离并存入HM_Dis,此时我们就已经得到一个串中第一个块的海明距离,只需要迭代下去,生成127的块并得到对应海明距离再相加,就能得到第一个串的海明距离
每迭代128次就获取到一个串中所有块的海明距离,相加即可得到串的海明距离
六、加速计算前i个串的均值组成的数组(串平均海明距离计算步骤的解释)
方法1
设一共生成了3个256比特位的串
S:xx_0 xx_1 xx_2
第一个串xx_0、xx_3的海明距离为d1
第二个串xx_1、xx_4的海明距离为d2
第三个串xx_2、xx_5的海明距离为d3
avg(i)表示前i个数的均值
avg(1)=d1
avg(2)=(d1+d2)/2
avg(3)=(d1+d2+d3)/3
不难发现
avg(i)=(avg(i)*(i-1)+di)/i
于是仅需要O(n)的计算复杂度就能完成计算,而不是O(n^2)
方法2
也可以使用cumsum来做,下面的代码就采用了这种方式
举例:
a=[2、4、6……、20]
计算1:10的avg数组
b=cumsum(a)
此时b的第1个元素:2
此时b的第2个元素:2+4
此时b的第3个元素:2+4+6
此时b的第4个元素:2+4+6+8
……
cumsum意为累进求和
拿到b后,c=b ./ [1、2、3……、10]得到[2、3、4……、11]
与方法2的结果是一样的
七、效果
八、代码
主脚本
clear;clc;
%% 初始化
bin=256; %一个串256比特位,可根据需要修改
turn=3e5; %串生成数量,可根据需要修改
f=4; %mod 4 意味着1个块有2个比特位,可根据需要修改
block=bin/f*log2(f); %共需128个块才能生成一个256比特位串
size_s=block*turn; %所有串中块的总数
precision=1e3; %计算精度
a = cre_R(2,2,3,29);
r = cre_R(2,2,11,37).*[1 0;0 1];
x_y = cre_R(2,1,2*rand(),2*rand());
Array=[0 1 1 2 %海明距离矩阵Array(i+1,j+1)为i、j二进制形式的海明距离
1 0 2 1
1 2 0 1
2 1 1 0];
%% 块海明距离计算
HM_Dis=zeros(1,size_s);
flag=1;
while(flag <= size_s)
x_y_t=x_y';
x_y=sin(sum(a .* r .* ([x_y_t;x_y_t] .* [1 0;0 1] + power([x_y_t;x_y_t] .* [0 1;1 0],2)),2));
if(x_y==0)
x_y = cre_R(2,1,rand(),rand());
end
s_block = mod(ceil(x_y*precision),f)+1;
HM_Dis(1,flag)=Array(s_block(1),s_block(2));
flag = flag +1;
end
%% 串海明平均距离计算
cumsum_HM=cumsum(HM_Dis,2);
block_avg_HM=cumsum_HM(1,block:block:size_s)./(1:turn);
fprintf("最后5对S:平均值计算:%4f %4f %4f %4f %4f\n",block_avg_HM(1,turn-4:turn));
辅助函数
function [ret] = cre_R(rows,cols,inf,nan)
ret=inf+rand(rows,cols).*(nan-inf);
end