据我所知,随机数生成器使用模运算符生成一个范围内的随机数。我很好奇的是为什么使用它比分裂更好。例如,我可以使用以下公式生成min
到max
范围内的随机数:
(max-min) * random_number/maximum_possible_number + min
其中maximum_possible_number
是可以表示的最大可能数字
这是有效的,因为random_number/maximum_possible_number
会生成介于0和1之间的数字。当它与max-min
相乘时,它是min
和max
之间的数字。
为什么使用模数算法优于此算法?
编辑:
为了测试这个算法,我写了下面的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');
EDIT2: (为了更详细地解释我的代码中发生的事情)。我生成了10000个随机数。这是通过使用randi()函数(对于每个数字)生成32位来完成的。在这样做的同时,最大可能的数字也在产生(连续32个1)。然后通过将随机32位除以最大可能数(32位为1)来计算随机数。