使用两个random()时如何生成无重复值

时间:2010-11-16 14:42:11

标签: c cocos2d-iphone

我正在生成随机数以存储行和列的矩阵索引。这是不同的行和列索引号每次都不重复。但是有些时候会产生相同的价值。如何纠正这个问题。

这就是我写的......例如

4 * 4矩阵。我正在运行循环和存储日期

int i;
for (i=0;i<6;i++)
  {

  Row    =     arc4random() % 4 ;
  Column =     arc4random() % 4;

  CGFloat xOffset1 = (block.contentSize.width+350)+((block.contentSize.height-15)*Column);  
  FireBlock.position = ccp(xOffset1,Row*15);

  statement 1--- store Column;
  statement 2--- store Row;
}

3 个答案:

答案 0 :(得分:4)

只有16种不同的组合,我将它们全部写入一个数组中,对数组进行洗牌,然后从数组中选择。

struct row_col_index {
    int row;
    int column;
};

/* ... */
    struct row_col_index all_combinations[4*4] = {
        {0, 0}, {0, 1}, {0, 2}, {0, 3},
        {1, 0}, {1, 1}, {1, 2}, {1, 3},
        {2, 0}, {2, 1}, {2, 2}, {2, 3},
        {3, 0}, {3, 1}, {3, 2}, {3, 3},
    };

    shuffle(all_combinations);
    for (int i = 0; i < 6; i++) {
        Row = all_combinations[i].row;
        Column = all_combinations[i].column;
        /* ... */
    }
/* ... */

答案 1 :(得分:3)

您可以维护一系列布尔值,以跟踪您已使用过的元素。例如:

int used[16];
memset(&used, 0, sizeof(used));  // All unused to start with

for (int i = 0; i < 6; i++)
{
    // Generate random number
    int r = arc4random() % 16;
    // Keep generating until we've found an unused element
    while (used[r])
    {
        r= arc4random() % 16;
    }
    used[r] = 1;   // Mark as used

    row = r % 4;
    col = r >> 2;

    ...
}

答案 2 :(得分:1)

如果你的矩阵是4x4,你首先有16个选择放置下一个条目。一旦它被放置,你有15个选择。一旦两个放置,14个选择。等等。您应该根据这个原则调整算法。