我想随机化一个动态数组,每列中没有重复的随机数,每列都是有限的,
检查我的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;
}
所以现在我想有任何其他方法来做,但我必须使用动态分配 请告诉我任何可以帮助我的事情。
答案 0 :(得分:2)
我会建议一些改变:
matrix[y * width + x]
),但这通常不会太难。答案 1 :(得分:1)
为了避免重复,有两种基本方法 - 1)将整个集合洗牌并从前面选择合适的子集,或者2)生成随机值,如果得到重复则拒绝并重试。如果您只从范围中抽取一些东西,选项2并不像听起来那么糟糕,但如果值的数量大于该范围的平方根,则选项1很容易成为赢家。
您可能会丢失switch语句。由于您的范围是i
的倍数,因此只需使用该事实来确定MAX
和MIN
值:
if (0 == i) {
MIN = 1;
MAX = 9;
} else {
MIN = 10 * b;
MAX = MIN + 9;
}
s = (rand() % (MAX - MIN + 1)) + MIN;
答案 2 :(得分:0)
如果你真的需要一个不重复数字的真正的随机数发生器,那根本就不是随机的:-),
最好的方法是根据需要创建一个列表,使用您需要的未重复的随机数,然后将它们按随机顺序排列。
- 编辑 -
如果你要生成1到99的X数字,我会做下一个算法:
你觉得那对你有用吗?它简单,快速,符合您的要求。