我将一些随机数存储到二维数组中,但有些数字似乎位于边/边上。我不确定它有什么问题。我想要的是在2d数组的边界内有所有随机数。
#include <stdio.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
void gameboard(char box[ROW][COL])
{
int x,y;
for(x = 0; x < ROW; x++)
{
for(y = 0; y <COL; y++)
{
box[x][y] =' ';
}
}
for(x = 0; x < ROW; x++)
{
box[0][x]='#';
box[x][8]='#';
box[x][0]='#';
box[8][x]='#';
}
}
void rnum(char box[ROW][COL])
{
int x,r1,r2,r3,r4;
char r='1';
srand( (unsigned) time(NULL));
for(x=0;x<9;x++)
{
r1 = rand()%9;
r2 = rand()%9;
r3 = rand()%9;
r4 = rand()%9;
box[r1][r2]= r + x;
box[r3][r4]= r + x;
}
}
int main(void)
{
char box[ROW][COL];
char name[20];
int x,y,choice;
gameboard(box);
rnum(box);
for(x = 0; x < ROW; x++)
{
for(y = 0; y < COL; y++)
{
printf(" %c ",box[x][y]);
}
printf("\n\n");
}
rnum(box);
return 0;
}
这是输出:
答案 0 :(得分:0)
rand() % 9
会返回0
和8
之间的数字。但是您的数组边框占据了索引0
和8
。
为避免覆盖,请在1
和7
之间选择一个随机数:
r1 = 1 + rand() % 7;
请注意,缩放rand()
的输出(除以RAND_MAX + 1
然后乘以上限)比使用余数更少偏差,但在您的情况下,它可能是不重要。
答案 1 :(得分:0)
我认为关键在于:
for(x=0;x<9;x++)
{
r1 = rand()%9;
r2 = rand()%9;
r3 = rand()%9;
r4 = rand()%9;
box[r1][r2]= r + x;
box[r3][r4]= r + x;
}
因为r1,r2,r3,r4是随机数,并且边界的坐标包含在其中。所以数字似乎在边/边上是正常的。
答案 2 :(得分:0)
照顾边界。不应覆盖任何元素[7]
或#
,因为for loop
字符已存在。计数器也决不超出数组边界。这是rnum()
中的for( x=0; x<7; x++) {
r1 = 1 + rand()%7; //always between 1 and 6 !
r2 = 1 + rand()%7;
r3 = 1 + rand()%7;
r4 = 1 + rand()%7;
box[r1][r2] = r + x;
box[r3][r4] = r + x;
}
:
public void setCharAt(int index, char ch) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
value[index] = ch;
}
答案 3 :(得分:0)
可以尝试以下代码:
#include <stdio.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
void gameboard(char box[ROW][COL]) {
int x,y;
for(x = 0; x < ROW; x++) {
for(y = 0; y <COL; y++) {
box[x][y] =' ';
}
}
}
void rnum(char box[ROW][COL]) {
int x,r1,r2,r3,r4;
char r='1';
srand( (unsigned) time(NULL));
for(x=0;x<9;x++) {
r1 = rand()%9;
r2 = rand()%9;
r3 = rand()%9;
r4 = rand()%9;
box[r1][r2]= r + x;
box[r3][r4]= r + x;
}
for(x = 0; x < ROW; x++) {
box[0][x]='#';
box[x][8]='#';
box[x][0]='#';
box[8][x]='#';
}
}
int main(void) {
char box[ROW][COL];
char name[20];
int x,y,choice;
gameboard(box);
rnum(box);
for(x = 0; x < ROW; x++) {
for(y = 0; y < COL; y++) {
printf(" %c ",box[x][y]);
}
printf("\n\n");
}
rnum(box);
return 0;
}
答案 4 :(得分:0)
如果您需要保持1-9之间的随机数范围,您可以使用以下功能。但是我不知道你需要多少随机数来填补这个块,所以我留给你。
void rnum(char box[ROW][COL]) {
int x,r1,r2,r3,r4;
char r='1';
srand( (unsigned) time(NULL));
int iter = 9;
x = 0;
while (iter != 0) {
r1 = rand()%9;
r2 = rand()%9;
r3 = rand()%9;
r4 = rand()%9;
if (r1 == 0 || r2 == 0 || r1 == 8 || r2 == 8 ||
r3 == 0 || r4 == 0 || r3 == 8 || r4 == 8)
continue;
else {
box[r1][r2]= r + x;
box[r3][r4]= r + x;
iter--;
}
x++;
}
}