在“C”中生成给定范围内的随机数组

我想生成一个随机数组,例如,如果范围是[0,10],那么所需的输出是2 3 5 6 4 7 8 9 0 1(非重复)

我面对rand()函数的问题有时我得到一些重复的nos,我是该范围内的离散值,每次调用时都是不同的顺序。

Ps:我确实经历了一些线程在一个范围内生成一个随机的双重在这里生成一个整个范围内的随机数并且不能使一个类似的矿井变细,这有一个微妙的区别。 特别是后者非常接近

这似乎是一个改变随机化问题的问题。

一个好的开始是Fisher-Yates shuffle ,它从排序的元素数组开始并生成随机排列:

int size = 10; int *elements = malloc(sizeof(int)*size); // inizialize for (int i = 0; i < size; ++i) elements[i] = i; for (int i = size - 1; i > 0; --i) { // generate random index int w = rand()%i; // swap items int t = elements[i]; elements[i] = elements[w]; elements[w] = t; } 

如果你开始使用一个整数为0-9(或者你的范围是什么)的数组,那么你会有一个更容易的时间,然后随机地将它洗牌。 这里有一个如何进行洗牌的例子。

你基本上想要随机化一个数组[0,1,…,9]。 这是一个C ++示例,应该很容易转换为C:

此代码仅适用于整数,但我希望它足够了。 我使用GCC进行编译,只使用C标准库。 阅读评论了解详情。 您的结果将具有不同的值,但因为它将是随机的。

 #include  #include  #include  #include  // http://man7.org/linux/man-pages/man3/errno.3.html #define ERROR_MIN_MORE_MAX_VALUE "Min value is more max value, returned 0" /* Returns a random integer in between min (inclusive) and max (inclusive) Returns 0 if min > max and to write a error message. */ static int random_integer(const int min, const int max) { if (max == min) return min; else if (min < max) return rand() % (max - min + 1) + min; // return 0 if min > max errno = EINVAL; perror(ERROR_MIN_MORE_MAX_VALUE); return 0; } /* Fills an array with random integer values in a range */ static int random_int_array(int array[], const size_t length, const int min, const int max){ for (int i = 0; i < length; ++i) { array[i] = random_integer(min, max); } return 0; } /* Print an array of integer items */ void print_int_array(int array[], size_t length) { char ending_charapter[] = ", "; putchar('['); for (size_t i = 0; i < length; ++i) { printf("%d", array[i]); if (i < length - 1) { printf("%s", ending_charapter); } } puts("]"); } int main (const int argc, const char *argv[]) { // for get a random integer number from a system, to pass a current time to the function srand srand(time(NULL)); int arr[10]; printf("\tAn array with random values from 0 to 100\n"); random_int_array(arr, 10, 0, 100); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 0\n"); random_int_array(arr, 10, -100, 0); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 100\n"); random_int_array(arr, 10, -100, 100); print_int_array(arr, 10); return 0; } 

结果

  An array with random values from 0 to 100 [86, 25, 98, 61, 42, 26, 87, 56, 86, 79] An array with random values from -100 to 0 [-33, -92, -57, -92, -6, -15, -61, -32, -75, -85] An array with random values from -100 to 100 [-15, -99, 54, 42, -74, 46, 6, -44, 86, -47] 

测试环境

 $ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.6 (jessie) Release: 8.6 Codename: jessie $ uname -a Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

+将所有数字放在结果数组中
+从N下降到2
+ —-随机播放N个元素
+返回数组

 fillarray(arr, 10); for (n = 10; n > 1; n++) shufflearray(arr, n); /* done */ 


编辑—感谢downvoter! 我甚至没有意识到我在那里做了太多的工作

  • 将所有数字放在结果数组中
  • 从N下降到2
  • —-用从1到N的随机元素交换元素N.
  • 返回数组