Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建填充随机唯一数的数组_C_Arrays_Random - Fatal编程技术网

C 创建填充随机唯一数的数组

C 创建填充随机唯一数的数组,c,arrays,random,C,Arrays,Random,所以我试图创建一个由4个项目组成的数组,其中随机填充4个唯一的数字。目前我有一个非常长的while循环,它检查数组中的每个值,并不断重复它们是否相同。它的编码非常糟糕,我想知道你们能否帮我找到一个更好的方法? 这是我目前拥有的 int array[4]; while(array[0] == array[1] || array[1] == array[2] || array[2] == array[3] || array[0] == array[2] || array[0] == array[3

所以我试图创建一个由4个项目组成的数组,其中随机填充4个唯一的数字。目前我有一个非常长的while循环,它检查数组中的每个值,并不断重复它们是否相同。它的编码非常糟糕,我想知道你们能否帮我找到一个更好的方法? 这是我目前拥有的

int array[4];
while(array[0] == array[1] || array[1] == array[2] ||  array[2] == array[3] || array[0] == array[2] || array[0] == array[3] || array[1] == array[3])
{
    array[0] = rand() % 20;
    array[1] = rand() % 20;
    array[2] = rand() % 20;
    array[3] = rand() % 20;
}

您希望生成0到19之间的随机数,并将其填充到数组中,而不包含任何重复项。
由于尚未初始化数组的元素,未初始化的值可能已经彼此不同。在这种情况下,将根本不执行while循环

其次,每当数组中的任意两个元素匹配时,您都会为它们生成随机值。这不是必需的。您必须仅为与任何现有元素匹配的元素重新生成随机数。这就是集合结构(在注释中提到)的作用

要洗牌n个元素的数组,使用,其工作时间复杂度为O(n)


在您的情况下,获取一个从0到19的初始值数组。一旦你洗牌了这个数组,你可以取这个数组的任意k个元素(在你的例子中是k=4)并使用它们(它们是不同的)。可以找到该算法的实现

这里有一个算法,用于生成由4个不同数字组成的数组,从0到20,即
O(n+m)
n
4个数字和
m
20个可能的值:

  • 创建一个包含20个整数的数组:{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}。这是用于拾取随机数的数组
  • array
    是一个包含结果的4个整数的数组
  • 对于从0到3(包括)的
    i
    • i
      19
      (含)之间选择一个随机数
      r
      。交换
      randArr[r]
      randArr[i]
    • 复制到
      array
      array[i]=randArr[i]
以下是实现(对合并最后两个步骤略有改进):

intrandarr[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int数组[4];
对于(int i=0;i<4;i++){
int r=i+rand()%(20-i);
数组[i]=randArr[r];
randArr[r]=randArr[i];
}

做一些关于的研究。如果只有两个值相同,为什么要重新滚动所有值?@Someprogrammerdude很有趣,但请帮助我了解这是如何支持解决方案的。假设有一个实现良好的集合可用,那么如何有效地支持创建四个不同的随机数?在伪码中:
while(size_of_set()
如果你转换成实码,那么之后你就保证有一组
N
唯一的随机数。逻辑更容易理解,不需要过多的条件,并且伸缩性很好(代码方面),因为
N
可能是
4
10000
,并且代码不会更改。@一些我以前从未听说过或使用过集合的程序员,我如何检查集合中的值?它与数组相同吗?
int randArr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int array[4];
for (int i = 0; i < 4; i++) {
        int r = i + rand() % (20 - i);
        array[i] = randArr[r];
        randArr[r] = randArr[i];
}