在MATLAB中使用randi来获取随机值:值不是均匀分布的

agn*_*zka 3 random matlab

我正在生成一个由0和1组成的随机字符串.我randi(2)-1用来获得一个随机生成的单值0或1.我希望得到1几乎和0一样频繁.相反,当我查看人口中的所有个体时,他们大多数是1.下面是代码 - 出了什么问题?

for iInd=1:individualsCount
    individual(attrCount) = 0;

    for i=1:attrCount
         individual(i) = randi(2)-1;
    end

    population{iInd} = individual;
end
Run Code Online (Sandbox Code Playgroud)

abc*_*bcd 8

首先,您不需要循环来生成0和1的随机字符串.试试这个:

individual = randi([0 1],[attrCount,1]);
Run Code Online (Sandbox Code Playgroud)

其次,再次,您不需要循环来构建您的population单元格.试试这个:

population=arrayfun(@(x)randi([0 1],[attrCount,1]),1:individualsCount,'UniformOutput',false)
Run Code Online (Sandbox Code Playgroud)

您可能必须更改行和列的顺序,具体取决于您要如何设置它.


现在,提出你的问题,你应该明白,这些分布是随机的,只有当你的样本量接近无穷大时,才会接近50%1s和50%0s的真正均匀分布.如果你attrCount的足够小,如果你没有找到接近50%的数字,不要感到惊讶.这并不意味着它是错的.就是这样.

以下是不同样本大小的随机二进制向量的1s分布.您可以看到,对于小样本量,存在高度可变性(并且绝不是这样......每次都会有所不同),而当您开始接近1000以上的大样本时,您的1s分布得到越来越接近50%,最终在无限远时正好是50%.

在此输入图像描述