C 如何生成不同整数的数组

C 如何生成不同整数的数组,c,C,我一直在尝试制作一个完全不同的随机整数数组,其中25个在1-75之间。已经陷入了一个无限循环。非常感谢您的帮助 我试图寻找解决方案,但我要么不理解,要么就是找不到适合我水平的解决方案。 顺便说一句,我已经确保我使用了srand(time(NULL)) (i=0;i

我一直在尝试制作一个完全不同的随机整数数组,其中25个在1-75之间。已经陷入了一个无限循环。非常感谢您的帮助

我试图寻找解决方案,但我要么不理解,要么就是找不到适合我水平的解决方案。 顺便说一句,我已经确保我使用了srand(time(NULL))

(i=0;i<25;i++)的

{
while(k!=1)
{
arr[i]=rand()%75+1;
对于(j=0;j<25;j++)
{
if(arr[i]==arr[j])
{
k++;
}
}
}
k=0;
}
全部代码:

/*********************************
* Class: MAGSHIMIM C2            *
* Week:                          *
* Name:                          *
* Credits:                       *
**********************************/

#include <stdio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(void)
{
    srand(time(NULL));
    int i = 0;
    int j = 0;
    int k = 0;
    int arr[25] = { 0 };
    for (i = 0; i < 25; i++)
    {
        while (k != 1)
        {
            arr[i] = rand() % 75 + 1;
            for (j = 0; j < 25; j++)
            {
                if (arr[i] == arr[j])
                {
                    k++;
                }
            }
        }
        k = 0;
    }
    for (i = 0; i < 25; i++)
    {
        printf("%d", arr[i]);
    }
    getchar();
    return 0;
}
/*********************************
*类别:MAGSHIMIM C2*
*周:*
*姓名:*
*学分:*
**********************************/
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
srand(时间(空));
int i=0;
int j=0;
int k=0;
int arr[25]={0};
对于(i=0;i<25;i++)
{
while(k!=1)
{
arr[i]=rand()%75+1;
对于(j=0;j<25;j++)
{
if(arr[i]==arr[j])
{
k++;
}
}
}
k=0;
}
对于(i=0;i<25;i++)
{
printf(“%d”,arr[i]);
}
getchar();
返回0;
}
经验D:一个很好的差异阵列,但我得到了一个无限循环

。。。但我有一个无限循环

替换

    while (k != 1)
    {
        arr[i] = rand() % 75 + 1;
        for (j = 0; j < 25; j++) {
          ...
        }
    }
    k = 0;

要清楚地看到这些值,还需要在它们之间添加一个空格,并添加一个最终换行符:

for (i = 0; i < 25; i++)
{
    printf("%d ", arr[i]);
}
putchar('\n');

编辑

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NINT 25
#define MAXI 75

int main (void) {

    int arr[NINT],
        seen[MAXI] = {0};
    srand (time(NULL));

    for (int i = 0; i < NINT; i++) {    /* for each needed element */
        int tmp = rand() % MAXI + 1;    /* generate a random in range */
        while (seen[tmp-1])             /* has been seen/used yet? */
            tmp = rand() % MAXI + 1;    /* if so, generate another */
        seen[tmp-1]++;                  /* incement element */
        arr[i] = tmp;                   /* assign unique value to arr */
    }

    puts ("array:");
    for (int i = 0; i < NINT; i++) {
        if (i && i % 5 == 0)
            putchar ('\n');
        printf (" %2d", arr[i]);
    }

    puts ("\n\nused:");
    for (int i = 0; i < MAXI; i++)
        if (seen[i])
            printf (" %d", i + 1);
    putchar ('\n');
}
实现很简单,但以这种方式查找尚未使用的值可能需要时间,并且允许值的范围越接近要返回的值的数量,所需的时间就越长。因此,当与允许值的范围相比,返回的值很少时,该解决方案是好的

与Weather Vane有趣的建议相反,对rand的调用次数仅等于要返回的值的数量,但允许值的范围越大,数组包越大,可能会溢出内存大小


对于1到75之间的25个值,风向标的解可能更好。。。甚至我的建议似乎只需要在raspberry pi上花费0.001秒,因此在内部for循环中几乎没有任何内容,对于j,迭代直到j 此外,每次检查以前的事件时,都将k的值初始化为零,这使代码更易于阅读

如果发现一个实例,只需中断,它会使算法运行得更快,即使它只会对较大的值产生影响

大概是这样的:

for (i = 0; i < 25; i++)
{
    k = 1;
    while (k != 0)
    {
        arr[i] = rand() % 75 + 1;
        k = 0; 

        for (j = 0; j < i; j++)
        {
            if (arr[i] == arr[j])
            {
                k++;
                break;
            }
        }
    }
}
(i=0;i<25;i++)的

{
k=1;
while(k!=0)
{
arr[i]=rand()%75+1;
k=0;
对于(j=0;j
一种方法是在所需范围内创建一个数字池或数字包,然后从中选择。与反复检查号码是否已被选中相比,这并不难,而且效率更高。您修改的程序现在是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ARRLEN  25          // how many to pick
#define NUMBERS 75          // range of available numbers
#if NUMBERS < ARRLEN        // precaution
    #error Impossible job!
#endif

int cmp(const void *a, const void *b)
// optional, for qsort
{
    return *(int *)a - *(int *)b;
}

int main(void)
{
    int arr[ARRLEN];                    // final array
    int bag[NUMBERS];                   // bag of available numbers
    int avail = NUMBERS;                // size of bag available
    srand((unsigned)time(NULL));

    // prepare the bag of available numbers
    for(int i = 0; i < NUMBERS; i++) {
        bag[i] = i + 1;
    }

    // fill the array with values from the bag
    for(int i = 0; i < ARRLEN; i++) {
        int index = rand() % avail;     // random index into array
        arr[i] = bag[index];            // take that number

        avail--;
        bag[index] = bag[avail];        // replace with the one from the top
    }

    // just to check, sort the array, can be deleted
    qsort(arr, ARRLEN, sizeof arr[0], cmp);

    // output the result
    for (int i = 0; i < ARRLEN; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    getchar();
    return 0;
}

int*fillint(int*arr,size\u t size)
{
加整数=0;
int pos=0
while(位置!=尺寸)
{
int-rv;
做
{
添加=1;
rv=rand();
对于(大小索引=0;索引
Weather Vane的包方法的另一个细微变化是,与其准备一个包含所有可用数字的包,不如简单地声明一个数组,其最大元素数等于接受的数字范围,并初始化为全部零(例如,
int arr[75]={0};
)。无需填充数组,只要在填充数组时每次使用该数字将元素增加1即可

为了确保只使用唯一的数字,请检查数组的对应元素是否为零,如果为零,请使用该数字并递增元素。如果它不是零,您知道该数字已被使用-生成另一个数字,然后重试

例如,如果数组的整数数为
25
,任何一个整数的最大值为
75
,则可以执行以下操作:

int *fillint(int *arr, size_t size)
{
    int added = 0;
    int pos = 0
    while(pos != size)
    {
        int rv;
        do
        {
            added = 1;
            rv = rand();

            for(size_t index = 0; index < pos; index++)
            {
                if(arr[index] == rv)
                {
                    added = 0;
                    break;
                }
            }
        }while(!added)
        arr[pos++] = rv;
    }
    return arr;
}
将其放在一个简短的示例中,您可以:

    for (int i = 0; i < MAXI; i++)
        if (seen[i])
            printf (" %d", i + 1);
    putchar ('\n');

无论您使用袋子还是数组来跟踪看到的数字,结果都是一样的。谁也比不上谁。将它们都添加到您的C-toolbox中。

而(k!=1){…;k++;…}
如果您进入此循环,只有当
k
在递增(可能多次)后变为等于1时,您才会离开此循环。循环开始时
k
是否小于1?请在此处添加整个代码。变量k的初始值是多少?@ForceBru它的默认值是0,只有在我们找到它时我们才会离开。你可以用do替换while,同时也可以在do while开始时移动k的重置,请参阅我的答案如果OP想要25个介于1和123456789之间的值,这是一种“有点”昂贵的方法否?;-)@布鲁诺:是的,但它适用于这项任务,以及许多类似的任务,如绘制扑克牌。但对于您的产品系列,仍然可以使用动态数组,这样就可以
免费
d。根据兰德公司的复杂性,我承认我从未看过它的implementation@bruno我将从m中构建一个随机数
for (i = 0; i < 25; i++)
{
    k = 1;
    while (k != 0)
    {
        arr[i] = rand() % 75 + 1;
        k = 0; 

        for (j = 0; j < i; j++)
        {
            if (arr[i] == arr[j])
            {
                k++;
                break;
            }
        }
    }
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ARRLEN  25          // how many to pick
#define NUMBERS 75          // range of available numbers
#if NUMBERS < ARRLEN        // precaution
    #error Impossible job!
#endif

int cmp(const void *a, const void *b)
// optional, for qsort
{
    return *(int *)a - *(int *)b;
}

int main(void)
{
    int arr[ARRLEN];                    // final array
    int bag[NUMBERS];                   // bag of available numbers
    int avail = NUMBERS;                // size of bag available
    srand((unsigned)time(NULL));

    // prepare the bag of available numbers
    for(int i = 0; i < NUMBERS; i++) {
        bag[i] = i + 1;
    }

    // fill the array with values from the bag
    for(int i = 0; i < ARRLEN; i++) {
        int index = rand() % avail;     // random index into array
        arr[i] = bag[index];            // take that number

        avail--;
        bag[index] = bag[avail];        // replace with the one from the top
    }

    // just to check, sort the array, can be deleted
    qsort(arr, ARRLEN, sizeof arr[0], cmp);

    // output the result
    for (int i = 0; i < ARRLEN; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    getchar();
    return 0;
}
6 7 8 9 12 16 17 19 21 27 31 35 43 46 47 50 51 53 59 64 65 66 70 71 72 2 6 7 14 17 23 24 25 30 31 32 34 36 37 45 58 59 61 65 68 69 71 73 74 75 5 10 13 18 20 21 25 30 34 36 39 40 41 43 49 50 54 58 60 63 64 66 67 72 75
int *fillint(int *arr, size_t size)
{
    int added = 0;
    int pos = 0
    while(pos != size)
    {
        int rv;
        do
        {
            added = 1;
            rv = rand();

            for(size_t index = 0; index < pos; index++)
            {
                if(arr[index] == rv)
                {
                    added = 0;
                    break;
                }
            }
        }while(!added)
        arr[pos++] = rv;
    }
    return arr;
}
#define NINT 25
#define MAXI 75
...
    int arr[NINT],
        seen[MAXI] = {0};
    ...
    for (int i = 0; i < NINT; i++) {    /* for each needed element */
        int tmp = rand() % MAXI + 1;    /* generate a random in range */
        while (seen[tmp-1])             /* has been seen/used yet? */
            tmp = rand() % MAXI + 1;    /* if so, generate another */
        seen[tmp-1]++;                  /* incement element */
        arr[i] = tmp;                   /* assign unique value to arr */
    }
    for (int i = 0; i < MAXI; i++)
        if (seen[i])
            printf (" %d", i + 1);
    putchar ('\n');
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NINT 25
#define MAXI 75

int main (void) {

    int arr[NINT],
        seen[MAXI] = {0};
    srand (time(NULL));

    for (int i = 0; i < NINT; i++) {    /* for each needed element */
        int tmp = rand() % MAXI + 1;    /* generate a random in range */
        while (seen[tmp-1])             /* has been seen/used yet? */
            tmp = rand() % MAXI + 1;    /* if so, generate another */
        seen[tmp-1]++;                  /* incement element */
        arr[i] = tmp;                   /* assign unique value to arr */
    }

    puts ("array:");
    for (int i = 0; i < NINT; i++) {
        if (i && i % 5 == 0)
            putchar ('\n');
        printf (" %2d", arr[i]);
    }

    puts ("\n\nused:");
    for (int i = 0; i < MAXI; i++)
        if (seen[i])
            printf (" %d", i + 1);
    putchar ('\n');
}
$ ./bin/randarr25-75
array:
  1 18 70 26 75
 29 31 58 22  9
  5 13  3 25 35
 40 48 44 57 56
 60 50 71 67 43

used:
 1 3 5 9 13 18 22 25 26 29 31 35 40 43 44 48 50 56 57 58 60 67 70 71 75