【发布时间】:2023-03-28 04:38:01
【问题描述】:
我想随机化一个动态数组,每列随机数不重复,每列都是有限的,
检查我的 main.c 文件
int main()
{
int i, j;
int **p;
srand(time(0));
p = malloc(9 * sizeof *p);
for (i=0; i<9; i++) {
p[i] = malloc (9 * sizeof *p[i]);
}
if (errno) {
perror("startup");
exit(1);
}
for (j=0; j<3; j++) {
for (i=0; i<9; i++) {
p[j][i] = random(j,i);
}
}
for (j=0; j<3; j++) {
for (i=0; i<9; i++) {
printf(" %d ", p[j][i]);
}
printf ("\n");
}
}
这是我的随机函数
int random(int *j, int *i)
{
int s = 0;
int b;
int MIN =0;
int MAX=0;
b= i;
switch (b)
{
case 0:
MAX = 9;
MIN = 1;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 1:
MAX = 19;
MIN = 10;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 2:
MAX = 29;
MIN = 20;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 3:
MAX = 39;
MIN = 30;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 4:
MAX = 49;
MIN = 40;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 5:
MAX =59;
MIN = 50;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 6:
MAX = 69;
MIN = 60;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 7:
MAX = 79;
MIN = 70;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
case 8:
MAX = 90;
MIN = 80;
s = (rand() % (MAX - MIN + 1)) + MIN;
break;
}
return s;
}
所以现在我想有任何其他方式来做到这一点,但我必须使用动态分配 请给我任何可以帮助我的建议。
【问题讨论】:
-
编译代码后得到了什么?
-
这个
int random(int *j, int *i)应该是int random(int j, int i)。 -
@hacks 这就是我得到的 prntscr.com/2auhee ,我想要没有重复的相同结果
-
显然是的,因为在非常有限的范围内,相同的数字很可能不止一次出现。我建议您阅读 unwind 的答案或添加一个简单的检查,以确保该号码之前没有被“挑选”过。虽然它非常低效。顺便说一句,
j似乎与您的random函数没有任何关系。 -
@BitFiddlingCodeMonkey 不,这是不对的。当您从一组没有放回的情况下进行抽样时,概率论中不会出现重复,例如从一副牌中挑选一系列卡片。
标签: c arrays dynamic random dynamic-arrays