伪随机数发生器

时间:2014-02-27 13:38:32

标签: matlab

我正在尝试在MATLAB中实现伪随机数生成器。我正按照以下方法构建它:

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

  2. For循环:使用rem创建下一个n个数字((25173 * previous_number + 13849)+ 2 ^ 16))。将数字n的第8 ... 15位保存到名为random_numbers的单元格中。打印编号n。

  3. 第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 个答案:

答案 0 :(得分: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; 行。