在动态数组C中生成无重复的随机数

时间:2013-12-13 15:35:10

标签: c arrays dynamic random dynamic-arrays

我想随机化一个动态数组,每列中没有重复的随机数,每列都是有限的,

检查我的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;
}

所以现在我想有任何其他方法来做,但我必须使用动态分配 请告诉我任何可以帮助我的事情。

3 个答案:

答案 0 :(得分:2)

我会建议一些改变:

  • 使用单个分配分配整个矩阵,这更容易。这意味着您必须手动进行索引(即matrix[y * width + x]),但这通常不会太难。
  • 您似乎对每列中显示的数字要求非常严格。我建议按顺序为所有数字预先播种矩阵,然后随机改组。它通常比消除欺骗更容易。

答案 1 :(得分:1)

为了避免重复,有两种基本方法 - 1)将整个集合洗牌并从前面选择合适的子集,或者2)生成随机值,如果得到重复则拒绝并重试。如果您只从范围中抽取一些东西,选项2并不像听起来那么糟糕,但如果值的数量大于该范围的平方根,则选项1很容易成为赢家。

您可能会丢失switch语句。由于您的范围是i的倍数,因此只需使用该事实来确定MAXMIN值:

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数字,我会做下一个算法:

  • 生成从1到99的数字列表,并将它们放在数组N上。
  • 对于i = 1到X,s = rand(S),从数组N
  • 取数字s
  • 一旦您从阵列中选择了X个不同的数字,就完成了。

你觉得那对你有用吗?它简单,快速,符合您的要求。