在下面的代码中,我想确保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
如果我能更清楚地解释,请告诉我。提前谢谢。
答案 0 :(得分:5)
您的代码完全符合您的要求,但可以使用randi(2)
并删除mod
的计算来简化代码。但是,有必要解决更多问题......
mod(xRand,2)
将1-100减少到0/1 对于介于1和100之间的xRand
,mod(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)
直接为您提供1
或2
作为 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
正如我们所看到的,percentage1
和percentage2
约为50,这意味着两个图像都会在50%的时间内被选中。 计算cnt1
和cnt2
之间的差异可能会产生误导,因为如果N
很大,这个数字可能很高。但是,如果我们观察到此差异,许多实现,总体平均值将近似为零。此外,我们可以观察到使用mod(randi(100),2)
的代码也提供了50%的分布。它不像randi(2)
的解决方案那样高效和直接,使用R2016a在我的机器上运行速度提高了大约15%。
底线:我建议使用上面提出的randi(2)
,因为它更直观,效率更高。观察到的差异归因于随机过程并使其自身与更多的实现相等。重要的是要考虑两个图像的百分比而不是绝对差异。
答案 1 :(得分:0)
你可以生成一个介于0和2之间的数字,然后检查xRand是否等于0或1,它甚至有可能发生;但是,较大的数字使得获得一个的机会变得更大。
(我已经说过两个,因为在声明随机值时,总是有一个额外值。)