在Arduino软件中随机播放一个数组

时间:2015-09-05 12:46:20

标签: arduino arduino-uno

使用Arduino软件对这个数组进行Shuffling有问题:

int questionNumberArray[10]={0,1,2,3,4,5,6,7,8,9};

有没有人知道函数内置或者在不重复的情况下对数组中的值进行洗牌的方法?

1 个答案:

答案 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