为什么使用modulo而不是division来生成范围内的随机数

时间:2018-04-02 15:44:22

标签: random

据我所知,随机数生成器使用模运算符生成一个范围内的随机数。我很好奇的是为什么使用它比分裂更好。例如,我可以使用以下公式生成minmax范围内的随机数:

(max-min) * random_number/maximum_possible_number  + min  

其中maximum_possible_number是可以表示的最大可能数字 这是有效的,因为random_number/maximum_possible_number会生成介于0和1之间的数字。当它与max-min相乘时,它是minmax之间的数字。

为什么使用模数算法优于此算法?

编辑:
为了测试这个算法,我写了下面的Matlab代码,在0到1之间逐位随机生成10000个数字并绘制它们:

clear all;

numBits = 32;
numbersToGenerate = 10000;

% Generate 10000 random numbers between 0 and 1
for i = 1:numbersToGenerate
    bits = randi([0 1], numBits, 1);
    s = 0;
    maxNumber = 0;
    for bit = 1:numBits
        s = s + bits(bit)*2^bit;
        maxNumber = maxNumber + 2^bit;
    end

    number(i) = s/maxNumber;
end


% Break into sections and count numbers within each section
size = .01;
for s = 0:size:1-size
    sections(int8(s/size)+1) = sum(number>s & number<s+size);
end

plot (0:size:1-size, sections);
xlabel('Number');
ylabel('Count');

输出如下: enter image description here

EDIT2: (为了更详细地解释我的代码中发生的事情)。我生成了10000个随机数。这是通过使用randi()函数(对于每个数字)生成32位来完成的。在这样做的同时,最大可能的数字也在产生(连续32个1)。然后通过将随机32位除以最大可能数(32位为1)来计算随机数。

0 个答案:

没有答案