【问题标题】:Generate random binary sequence with a specific ratio生成具有特定比率的随机二进制序列
【发布时间】:2015-09-04 11:54:08
【问题描述】:

我想生成一个比例为 50% 的随机二进制序列,即相同数量的 0 和 1。这是我目前所拥有的:

length_sequence = 1000;
ratio = 0.5;
A = logical(randi([0 1],length_sequence,1));

唯一的问题是我不知道如何设置比率。

【问题讨论】:

  • 你的意思是 deterministic 比率(每个实现需要 500 个 1 和 500 个 0)还是 probabilistic 比率(一个实现可能有比零,但该比率适用于许多实现)?
  • @LuisMendo 的观点是有效的。根据你想要的,它们之间的代码会有很大的不同。

标签: arrays matlab random


【解决方案1】:

该比率可以解释为确定性(您希望在 1000 个值的每个实现中都有 500 个 1 和 500 个零)或 概率(实现可能有比零,但该比率适用于大量实现)。

您的代码适用于概率解释,所以我假设您的意思是确定性解释。在这种情况下,用任意顺序的零和一值填充A(例如:首先全为一,然后全为零),然后应用随机排列:

length_sequence = 1000;
ratio = 0.5; %// interpreted as proportion of ones that there must be in any realization
A = zeros(1,length_sequence);
A(1:round(length_sequence*ratio)) = 1;
A = A(randperm(length_sequence));

【讨论】:

    【解决方案2】:

    您可以通过以下两种方式之一来解决此问题(à la Luis Mendo):

    方法 #1 - 确定性

    如果您知道每次创建此向量时需要正好 500 个 1 和 500 个 0,则可以生成从 1 到 1000(或通常从 1 到尽可能多的元素)的集合索引如你所愿 - num_elements) 并提取 500 个(或一般round(ratio*num_elements),其中ratio[0,1] 之间)。然后,您将使用这些索引并将初始零向量中的位置设置为 1:

    num_elements = 1000;
    ratio = 0.5; %// 50%
    ind = randperm(num_elements, round(ratio*num_elements));
    A = zeros(num_elements,1) == 1; %// Convert to logical
    A(ind) = 1;
    

    方法 #2 - 概率

    您可以从[0-1] 和阈值为 0.5 或ratio 生成均匀分布的随机值:

    num_elements = 1000;
    ratio = 0.5;
    A = rand(num_elements, 1) >= ratio;
    

    这在概率意义上用 50%(或通常ratio)将值设为 0 的机会和 50%(或通常1 - ratio)将值设为 1 的机会填充向量中的每个值.

    【讨论】:

    • 我们有同样的想法! :-)
    • @LuisMendo - 一生中只有一次,我有与你相同的解决方案:P +1 也为你服务。
    • 效果很好!谢谢你们俩! (我正在寻找确定性方法)
    • @rayryeng 我不这么认为! :-D
    猜你喜欢
    • 2013-11-05
    • 2014-03-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2016-08-31
    相关资源
    最近更新 更多