【问题标题】:Using randi in MATLAB to get random values: values are not distributed uniformly在MATLAB中使用randi获取随机值:值分布不均匀
【发布时间】:2011-12-05 11:07:31
【问题描述】:

我正在生成由 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

【问题讨论】:

    标签: matlab random


    【解决方案1】:

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

    individual = randi([0 1],[attrCount,1]);
    

    其次,同样,您不需要循环来构造 population 单元格。试试这个:

    population=arrayfun(@(x)randi([0 1],[attrCount,1]),1:individualsCount,'UniformOutput',false)
    

    您可能需要根据您的设置方式更改行和列的顺序。


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

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

    【讨论】:

    • 顺便说一句:请注意,由于最近的 Matlab 版本中的 JIT 编译器,for 循环不再像以前那样糟糕。根据attrCountindividualsCount 的值,显式for 循环可以比arrayfun 快4 倍。不过,显然,从randi 请求一个二维矩阵 (attrCount x individualCount) 是最有效的解决方案。
    • @MattB。我同意,JIT 编译器已经取得了相当大的进步。几个月前,我在短暂休息后再次使用 MATLAB,我对我朋友笨拙的嵌套 4 for 循环解决方案比我的“智能”、紧凑和矢量化解决方案(过去比循环快得多)感到震惊过去)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2020-11-25
    • 2018-10-24
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多