生成大小为N的随机二进制向量X的最佳方法是什么,其浓度为1s(或同步,0s),从非常低到非常高?
使用randint或unidrnd(如this question中所示)将生成具有均匀分布的二元向量,这不是我在这种情况下所需要的。
任何帮助表示赞赏!
答案 0 :(得分:6)
Laserallan的方法是可行的方法。
对于具有10个元素和70%随机分布的向量,您可以编写
randVec = rand(10,1)<0.7;
编辑如果你想要长度为N的X向量,随着数量的增加,你就写了
thresVec = linspace(0,1,X); %# thresholds go from 0 (all 0) to 1 (all 1)
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column
请注意,randVec是一个逻辑数组。根据你想要用它做什么,你可能希望将它转换为双倍的
randVec = double(randVec);
答案 1 :(得分:3)
我不是matlab的专家,但实现起来非常简单的方法是生成浮点随机数的向量(最好在1到0的范围内),然后将高于某个阈值的值设置为1和低于0。 假设您想要30%的值,则将所有值设置为.7到1以及低于0的值。
答案 2 :(得分:2)
使用
rand(N,1)<p %# 0 < p < 1
会给你一个Nx1向量,其中平均 N * p个(其他地方将为零) - 但是在某些运行中你可能会得到一个与你期望的不同的向量(它可能全部为零......可能是一个非常低的机会,但仍然是非零的机会)。
如果你想要完全 A和B零,你可以这样做:
rand_vec = [ones(A, 1); zeros(B, 1)];
rand_vec = rand_vec(randperm(A+B));
然后您可以设置A和B以满足您的需求。
修改强>
现在我更了解你的问题:
假设你有一个向量p,其中包含人口中1的所需比例,N是每个向量中元素的数量。
rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])';
会给你一个Nx(大小(p,2))矩阵,其中列i是一个p(i)的向量(平均如上所述),其余为零。
答案 3 :(得分:1)
你可以对均匀分布的二进制向量使用位或运算,我怀疑你最终得到的确切分布会有点复杂。