使用Arduino软件对这个数组进行Shuffling有问题:
int questionNumberArray[10]={0,1,2,3,4,5,6,7,8,9};
有没有人知道函数内置或者在不重复的情况下对数组中的值进行洗牌的方法?
答案 0 :(得分:2)
最简单的方法是这个小for
循环:
int questionNumberArray[] = {0,1,2,3,4,5,6,7,8,9};
const size_t n = sizeof(questionNumberArray) / sizeof(questionNumberArray[0]);
for (size_t i = 0; i < n - 1; i++)
{
size_t j = random(0, n - i);
int t = questionNumberArray[i];
questionNumberArray[i] = questionNumberArray[j];
questionNumberArray[j] = t;
}
让我们逐行打破它,不管吗?
int questionNumberArray[] = {0,1,2,3,4,5,6,7,8,9};
如果你初始化这样的数组,你不需要放入多少个单元格。只要像我一样将括号留空。
const size_t n = sizeof(questionNumberArray) / sizeof(questionNumberArray[0]);
我决定以n
为单位存储单元格数量。运算符sizeof
给出了数组占用的字节数和一个单元占用的字节数。您将第一个数字除以第二个数字,并且您拥有数组的大小。
for (size_t i = 0; i < n - 1; i++)
请注意,循环的范围是n - 1
。我们不希望i
拥有最后一个索引的值。
size_t j = random(0, n - i);
我们声明变量j
指向某个索引大于i
的随机单元格。这就是为什么我们从不希望i
具有n - 1
值 - 因为那时j
将超出范围。我们使用Arduino random
函数得到随机数:https://www.arduino.cc/en/Reference/Random
int t = questionNumberArray[i];
questionNumberArray[i] = questionNumberArray[j];
questionNumberArray[j] = t;
简单交换两个值。可以在没有临时t
变量的情况下执行此操作,但代码的可读性较低。
在我的情况下,结果如下:
questionNumberArray[0] = 0
questionNumberArray[1] = 9
questionNumberArray[2] = 7
questionNumberArray[3] = 4
questionNumberArray[4] = 6
questionNumberArray[5] = 5
questionNumberArray[6] = 1
questionNumberArray[7] = 8
questionNumberArray[8] = 2
questionNumberArray[9] = 3