2015-09-05 70 views
2

阵列我有这个洗牌阵列的Arduino软件有问题:随机播放的Arduino软件

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

有谁知道在函数生成或方式来洗牌数组中的值没有任何重复?

+0

你尝试谷歌“洗牌阵”? – TDG

+0

http://forum.arduino.cc/index.php?topic=43424.0 –

+0

我做了,这些答案只适用于二进制数组,因为值可以重复,因为我试图解释我的问题。 – murloc

回答

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