c - 如何在 C 中生成一个随机且唯一的整数数组?
问题描述
我正在创建一个需要 17 个整数的数组的 C-prog,所有整数都小于 18 并且是唯一的。这是我到目前为止可以做的:
int ques_arr[17];
int x,y;
time_t t;
srand((unsigned)time(&t));
for(int a=0; a<17; a++)
{
x=rand()%18; //Assume that srand() has been declared in the program
for(int aa=0; aa<17; aa++)
{
if(x==ques_arr[aa])
{ do{
y=0;
y=rand()%18;
}while(y==ques_arr[aa]);
x=y;
ques_arr[a]=x;
}else ques_arr[a]=x;
}
}
我目前的算法是每次 rand() 生成一个数字,该数字将在整个数组中检查是否已经存在相同的数字,如果存在,rand() 继续生成一个数字,直到获得一个唯一的数字然后它是存储在数组中。如果数组中不存在这样的数字,则直接将其输入。
到目前为止,存储在数组中的数字并不是唯一的。
任何帮助,将不胜感激。
解决方案
这不是最佳解决方案,一旦解决了代码中的问题,您的时间复杂度为 O(n²),您可以使用“Knuth Shuffle algorithm”将时间复杂度降低到 O(n):
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
static int rrand(int value)
{
return (int)((double)value * (rand() / (RAND_MAX + 1.0)));
}
static void randomize(int arr[], int size)
{
for (int idx = 0; idx < size; idx++)
{
arr[idx] = idx;
}
for (int idx = size; idx > 1; idx--)
{
int num = rrand(idx);
int tmp = arr[idx - 1];
arr[idx - 1] = arr[num];
arr[num] = tmp;
}
}
int main(void)
{
srand((unsigned)time(NULL));
int arr[17] = {0};
int size = sizeof arr / sizeof *arr;
randomize(arr, size);
for (int idx = 0; idx < size; idx++)
{
printf("%d\n", arr[idx]);
}
return 0;
}
推荐阅读
- batch-file - 任务所有者未登录时 start /b cmd /c 不起作用
- bugzilla - 在 Window 10 上安装 Bugzilla 时出现问题
- r - 加入两个数据帧以删除第一个数据帧中的 NaN 值
- azure - 如何在 Azure 逻辑应用中检查大于条件块
- python - Numpy 数组的 feed_dict 形状问题
- android - Flutter 应用程序无法在 android 上构建或运行
- python - kivy - 为什么视频播放器显示错误?
- javascript - 如何在画布动画上写文字
- python-sphinx - 在 reStructuredText CSV 表中创建引用
- python - keras 使用权重加载模型,发出 ValueError: Dimension 1 in both shape must be equal, but are 124 and 121