2010-11-16 82 views
0

我生成随机编号存储的行和列我矩阵指数。这是不同的行列索引号每次都不重复。但是,一段时间内同样的价值正在产生。如何纠正这个问题。如何使用没有重复值生成两个随机()

这是我写的..例如

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; 
} 

回答

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; 
     /* ... */ 
    } 
/* ... */ 
+0

这是不可能的我的程序,因为我的代码射击游戏。差异。水平我正在产生每个级别的差异矩阵。所以它不可能为矩阵索引赋值 – SOF 2010-11-16 19:34:23

3

你可以保持跟踪哪些元素,你已经使用过的boolean数组。例如:

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; 

    ... 
} 
+0

你可以解释为什么你不需要2'used'阵列:1的行,另一个用于列(我知道为什么,但它不是很明显。对于每个人):-) – pmg 2010-11-16 14:57:07

+0

其工作。但是,当我使用矩阵8 * 4相同的修改代码不起作用。索引行和列取7,10,8等,但不是16行和列索引值。我实现了任何错误。 循环16是我的矩阵索引最大值。 int used [32]; memset(&used,0,sizeof(used)); //所有未使用开始与 对(INT I = 0; I <16;我++){ // 生成随机数 INT R = arc4random()%32; //保持生成,直到我们已经找到一个未使用元素 同时(使用[R]) { R = arc4random()%32; } used [r] = 1; //标记为已使用 row = r%8; col = r >> 2; ... } – SOF 2010-11-16 19:29:03

+0

无论你写在示例代码工作.. 首先我需要澄清上述示例..这是我明白.. 使用[16] - > 16是4 * 4 = 16矩阵价值。 r = arc4random()%16 - > 16再次是矩阵的最大值4 * 4; row = r%4 - >行的最大值。 其正确。好 。我再次提问。 我正在实施cocos2d iphone游戏开火。有很多层次。我的矩阵也改变了每个级别.. – SOF 2010-11-16 19:31:36

1

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