我想生成一个随机数组,例如,如果范围是[0,10],那么所需的输出就是 2 3 5 6 4 7 8 9 0 1(非重复性)
我面对rand()函数的问题有时我得到一些重复的nos,我是该范围内的离散值,每次调用时都是不同的顺序。
Ps:我确实经历了一些线程 Generate a random double in a range Generate random numbers uniformly over an entire range 在这里,并没有罚款一个类似的矿山,有一个微妙的区别。特别是后者非常接近
答案 0 :(得分:9)
这似乎是改变随机化的问题。
一个好的开始是 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;
}
答案 1 :(得分:2)
如果您开始使用整数0-9(或任何范围)的数组,然后随机随机播放,您将会有更轻松的时间。有一个如何进行改组的例子here。
答案 2 :(得分:1)
你基本上想要随机化一个数组[0,1,...,9]。这是一个C ++示例,应该很容易转换为C:
答案 3 :(得分:0)
此代码仅适用于整数,但我希望它足够了。我使用GCC进行编译,只使用C标准库。阅读评论了解详情。您的结果将具有不同的值,但因为它将是随机的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h> // 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.
答案 4 :(得分:-1)
+将所有数字放在结果数组中
+从N到2
+ ----洗牌N个元素
+返回数组
实施例
fillarray(arr, 10);
for (n = 10; n > 1; n++) shufflearray(arr, n);
/* done */
编辑---感谢downvoter!我甚至没有意识到我在那里做了太多的工作