如何在随机位置用特定数量的 1 和 0 填充数组?
How to fill array with specific number of 1's and 0's in random locations?
我有一个数组,有 8 个点要填充,4 个 1 和 4 个零要填充,但希望位置是随机的。我有点困惑于如何做到这一点而不会变得多余。有没有一种简单的方法可以做到这一点,或者我是否必须随机用 1 或 0 填充数组,然后在事后检查它是否有正确的数量?我当前的代码是这样的
void setup() {
int one = 0;
randomSeed(analogRead(A0));
for (int i=0; i<8; i++){
array[i] = random(0, 2);
if (array[i] == 1){
one++;
}
if(one >4){
array[i] = 0;
one--;
}
}
}
这主要有效,但有一些明显的缺点,因此任何关于更好方法的指针将不胜感激。
更新:这个答案与原来的略有不同
对于资源紧张的Arduino,这段代码就足够了,不需要链接额外的库:
int a[8] = { 0,0,0,0,1,1,1,1 };
void setup() {
randomSeed(analogRead(A0));
for (int n=7;n>0;n--) {
int r = random(n+1);
int t = a[n];
a[n] = a[r];
a[r] = t;
}
}
这正是 std::shuffle 函数的实现方式,仅受内置 Arduino random()
函数实现的有效性的限制。
如果您需要在
零数组中生成m
个随机数组,您可以简单地遍历整个数组并将当前元素设置为 1,概率如下P
number of 1's that remains to be set
P = ----------------------------------------------------
number of array elements that remains to be iterated
在您的情况下,您需要在 4 个元素的数组中设置 8 个随机 1
const unsigned N = 8, M = 4;
int array[N];
for (unsigned i = 0, m = M; i < N; ++i)
if (rand() % (N - i) < m)
{
array[i] = 1;
--m;
}
else
array[i] = 0;
这将一次性生成随机数组 - 无需对任何内容进行后洗牌。
附言为了以上述概率做出决定P
我使用了经常受到批评的rand() % (N - i) < m
方法。当然,这不是重点。您可以使用您选择的任何其他方法。
相关文章:
- C++ 填充数组时遇到问题
- 如何使用同时设置计数和填充数组的函数
- 如何使填充数组的函数发送到函数?而不是其参数中的数组
- 如何使用文件填充数组并将其与用户输入C 进行比较
- 使用 memset 填充数组会显示垃圾
- Visual Studio从文件中填充数组时中断
- 分段 填充数组时出错
- 用不同的值填充数组/矢量的边缘和中心
- 使用相同的数据填充数组对象或使用指针
- 是否可以使用三元运算符"?"在 C/C++ 中填充数组列表?
- 填充数组(写入位置0x00000000的访问冲突)
- 从文件中读取输入并填充数组以存储数据供以后使用
- c++当循环在填充数组时没有正确终止时,希望能帮助退出此循环
- 填充数组会导致数组周围的堆栈损坏
- Cuda有效地将数据插入到未排序的填充数组中
- 填充数组的 C++ 函数
- 访问部分填充数组上的第一个打开元素
- 将一个字节数组从C#传递到C++填充数组的C++com对象中
- 如何使用向量中的信息填充数组并从数组中选择随机项
- C,填充数组使用dec2bin转换器