2014-02-27 59 views
1

我试图在MATLAB中实现一个伪随机数发生器。我按照以下配方构建它:伪随机数发生器

  1. 创建随机数生成器种子x_0。获取并保存x_0的位8 ... 15到名为random_numbers的单元。

  2. For Loop:使用rem((25173 * previous_number + 13849)+ 2^16))创建接下来的n个数字。将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 

那么,有什么问题呢?如果你运行这个代码,你会注意到最初的数字是唯一的。最初的数字不会重复。然而,使用此算法创建的其余数字确实遵循特定模式。我希望每个数字都遵循相同的模式。如果有人能帮我弄清楚我做错了什么,我将非常感激。

回答

1

你的代码看起来除了线经典algorithm for random number generation

random_number = random_number(8:15); 

我以为你补充说,因为要产生随机数从0到255的问题是,该行正在影响不仅仅是输出数量,而且状态您保存下一个迭代。这就是可能导致问题的原因。

如果你想改变输出数字,那很好,但你不应该改变将用于产生下一个数字的状态。如果你这样做,你正在改变算法,以及发电机状态序列的周期。

所以:移动线random_number = random_number(8:15);线random_numbers{x} = random_number;

+0

不,我正在提取更高位,因为根据http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use,高位比周期低。总之,这种方法在Java的随机数发生器中实现。 – RazGo

+0

@ user1497133仔细阅读我的答案。一件事是种子(状态),另一件事是输出数量。您可以删除输出中的位,但不能在状态 –

+0

我相信你是对的。非常感谢您的帮助! – RazGo