我正在尝试在MATLAB中实现伪随机数生成器。我正按照以下方法构建它:
创建随机数生成器种子x_0。获取并将x_0的第8 ... 15位保存到名为random_numbers的单元格中。
For循环:使用rem创建下一个n个数字((25173 * previous_number + 13849)+ 2 ^ 16))。将数字n的第8 ... 15位保存到名为random_numbers的单元格中。打印编号n。
第1步:
n = 2000;
% Pre-allocate cell with size n numbers
random_numbers = cell(1, n);
% Generate seed in range 1 - 2^16 - 1
x_0 = randi([1, 2^16-1]);
% Save seed as binary array of size 16 bits
x_0 = de2bi(x_0, 16);
% Extract bits 8...15 from seed
x_0 = x_0(8:15);
% Add bits 8...15 from seed to cell
random_numbers{1} = x_0;
第2步:
for x = 2:n
% Get previous number as base 10 number
previous_number = bi2de(random_numbers{x - 1});
% Calculate random number
random_number = rem( (25173 * previous_number + 13849), 2^16 );
% Convert random number to binary, extract bits 8...15
random_number = de2bi(random_number, 16);
random_number = random_number(8:15);
% Save bits 8...15 of random number to cell
random_numbers{x} = random_number;
% Print bits 8...15 of random number as decimal number
disp(num2str(bi2de(random_number)))
end
那么问题是什么?如果您运行此代码,您会注意到初始数字是唯一的。初始数字不会重复。但是,使用此算法创建的剩余数字确实遵循某种模式。我希望每个数字都遵循相同的模式。如果有人能帮助我弄清楚我做错了什么,我将非常感激。
答案 0 :(得分:1)
除了
行外,您的代码看起来像经典algorithm for random number generationrandom_number = random_number(8:15);
我假设您添加了因为您想要生成0到255之间的随机数。问题是该行不仅影响输出数量,还影响您为下一个保存的状态迭代。这就是造成这个问题的原因。
如果你想改变输出数字,那很好,但是你不应该改变用于生成下一个数字的状态。如果这样做,您将更改算法和生成器状态序列的周期。
所以:在行random_number = random_number(8:15);
之后移动random_numbers{x} = random_number;
行。