随机化数组元素序列

时间:2012-07-13 07:30:16

标签: c algorithm

  

可能重复:
  Is this C implementation of Fisher-Yates shuffle correct?

为了模拟输入序列的不同顺序到我的应用程序,我想生成一个数组输入的随机序列列表。例如,给定一个arr [10],默认序列是0,1,..,8,9。但是,我想将序列操纵为随机顺序,例如,2,4,5,1,9,0,3,7,8,6。

我认为rand()会生成0-9之间的随机值,但不能确保每个元素至少生成一次。在这种情况下,我在考虑下面的伪,但有没有更好的方法来生成随机输入序列,并确保给定范围内的每个数字至少生成一次?

round #1:  
  generate a random number within 0-9.  
    let say 2 is selected  

round #2:  
    generate a random number within 0-1  
    generate a random number within 3-9  
    let say 0 and 4 are selected  

round #3:  
    generate a random number within 1  
    generate a random number within 3  
    generate a random number within 5-9  
    let say 1, 3, 7 are selected  

round #4:  
    generate a random number within 5-6  
    generate a random number within 8-9  

continue until 10 numbers are selected

2 个答案:

答案 0 :(得分:2)

根据您的要求,查看Fisher-Yates shuffle算法here

答案 1 :(得分:1)

这是另一种方法:

  1. 创建包含10个元素的数组,并使用您想要随机化的值(0,1,...,9)填充它。
  2. 将k从9减少到0并选择一个随机数index = rand(k)。
  3. 将位置为k的元素与位置索引处的元素交换。
  4. 最后,您的数组将包含原始值的随机排列,这正是您想要的。