我正在生成随机数以存储行和列的矩阵索引。这是不同的行和列索引号每次都不重复。但是有些时候会产生相同的价值。如何纠正这个问题。
这就是我写的......例如
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;
}
答案 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个选择。等等。您应该根据这个原则调整算法。