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