2

在下面的代码中,我想确保 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

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

4

2 回答 2

5

tl;博士

您的代码完全符合您的要求,但可以通过使用randi(2)和删除mod. 然而,有必要解决更多的问题......


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

xRand1 到 100 之间,结果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将它们简化为仍然均匀分布的二进制表示,因为映射是针对相等的 bin 完成的。


使用简化randi(2)

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

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% 的时间里都被选中。计算和之间的差异可能会产生误导cnt1cnt2因为如果很大,这个数字可能会很高N但是,如果我们在许多实现中观察到这种差异,则总体平均值将近似为零。此外,我们可以观察到您的代码 usingmod(randi(100),2)也给出了 50% 的分布。它不如randi(2)使用 R2016a 的解决方案在我的机器上的执行速度快约 15%。

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

于 2016-07-09T10:43:24.027 回答
0

您可以生成一个介于 0 和 2 之间的数字,然后检查 xRand 是否等于 0 或 1,这有可能发生;然而,更大的数字使得获得一个超过另一个的机会变化更大。

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

于 2016-07-09T04:13:51.170 回答