创建具有偶概率的随机int生成器

时间:2016-07-09 04:02:02

标签: matlab random mod

在下面的代码中,我想确保theImageRand偶然等于theImage或theImage2,但我意识到1到100之间的数字等于2 mod 1而不是2 mod 0.所以theImage正在选择不成比例的时间。

这是我遇到的最简单的想法,但也许有一个功能可以做到这一点更容易?我也在想我能找到一个符合我所寻找的数字并将其放入randi(n)。

xRand = randi(100);
    if mod(xRand,2) == 1 
       theImageRand = theImage;
    elseif mod(xRand,2) == 0
       theImageRand = theImage2;
    end

如果我能更清楚地解释,请告诉我。提前谢谢。

2 个答案:

答案 0 :(得分:5)

TL;博士

您的代码完全符合您的要求,但可以使用randi(2)并删除mod的计算来简化代码。但是,有必要解决更多问题......

mod(xRand,2)将1-100减少到0/1

对于介于1和100之间的xRandmod(xRand,2)的结果将在0和1上平均分配,如执行以下代码所示:

xRand = 1:100;
xMod = mod(xRand,2);
cnt1 = sum(xMod == 1)    % results in 50
cnt0 = sum(xMod == 0)    % results in 50 as well

基本上,您的代码按预期工作,因为randi选择从1到100的均匀分布的数字。随后,mod将它们缩减为二进制表示,由于映射是相等的,因此仍然均匀分布二进制位。

使用randi(2)

进行简化

通过从头开始生成二进制集,可以简化生成这些均匀分布的二进制数的整个过程。为实现此目的,您可以使用randi(2)直接为您提供12作为 rayryeng 在他对该问题的评论中指出。
这会给你以下代码:

xRand = randi(2);
if xRand == 1 
   theImageRand = theImage;
elseif xRand == 2
   theImageRand = theImage2;
end

这是对的吗?

现在我们来看一下这个问题的有趣部分:结果是否真的均匀分布?要检查一下,我们可以运行代码N次,然后分析一下每个图像的选择次数。因此,我们将1分配给第一个图像,将2分配给第二个图像,并将结果存储在res中。在for循环之后,我们将它们为1或2的元素之和。

N = 1000000;

theImage = 1;
theImage2 = 2;

res = zeros(N,1);

for n = 1:N
    xRand = randi(2);
    if xRand == 1
       theImageRand = theImage;
    elseif xRand == 2
       theImageRand = theImage2;
    end
%     xRand = randi(100);
%     if mod(xRand,2) == 1
%        theImageRand = theImage;
%     elseif mod(xRand,2) == 0
%        theImageRand = theImage2;
%     end
    res(n) = theImageRand;
end

cnt1 = sum(res==1);
cnt2 = sum(res==2);

percentage1 = cnt1/N*100    % approximately 50
percentage2 = cnt2/N*100    % approximately 50 as well

正如我们所看到的,percentage1percentage2约为50,这意味着两个图像都会在50%的时间内被选中。 计算cnt1cnt2之间的差异可能会产生误导,因为如果N很大,这个数字可能很高。但是,如果我们观察到此差异,许多实现,总体平均值将近似为零。此外,我们可以观察到使用mod(randi(100),2)的代码也提供了50%的分布。它不像randi(2)的解决方案那样高效和直接,使用R2016a在我的机器上运行速度提高了大约15%。

底线:我建议使用上面提出的randi(2),因为它更直观,效率更高。观察到的差异归因于随机过程并使其自身与更多的实现相等。重要的是要考虑两个图像的百分比而不是绝对差异。

答案 1 :(得分:0)

你可以生成一个介于0和2之间的数字,然后检查xRand是否等于0或1,它甚至有可能发生;但是,较大的数字使得获得一个的机会变得更大。

(我已经说过两个,因为在声明随机值时,总是有一个额外值。)