1、关于C语言中有rand()函数来产生随机数,但是初始seed为1,这样做有一个问题,即会产生固定序列的数,比如单独调用rand()时会产生
1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421…
即使在其他进程中执行也会得到相同的序列;如果得到的数据可以预测,那么就不是真正的随机数了,因为你永远不知道你掷色子的下一次是什么数;为了避免这种“尴尬”的随机数生成方式,需要使用不同的seed;
一般实现方法是通过srand(unsigned seed)来设置,通常使用time()函数作为seed参数
使用形式:srand((unsigned)time(NULL));
2、关于生成[start_num, end_num]的随机数
#include
#include
#include
int main(int argc, char *argv[])
{
int i;
unsigned start_num;
unsigned end_num;
if (argc != 3)
{
printf("please input start num and end num! argc: %d\n", argc);
return -1;
}
start_num = atoi(argv[1]);
end_num = atoi(argv[2]);
if (start_num >= end_num)
{
printf("invalid args!\n");
return -1;
}
srand((unsigned)time(NULL));
for(i = 0; i < end_num - start_num + 1; i++)
printf("%d ", rand() % (end_num - start_num + 1) + start_num);
printf("\n");
return 0;
}
3、关于生成不重复[start_num, end_num]的随机数
#include
#include
#include
int main(int argc, char *argv[])
{
int i, temp, rand_index;
unsigned start_num;
unsigned end_num;
int *a = NULL;
if (argc != 3)
{
printf("please input start num and end num! argc: %d\n", argc);
return -1;
}
start_num = atoi(argv[1]);
end_num = atoi(argv[2]);
if (start_num >= end_num)
{
printf("invalid args!\n");
return -1;
}
srand((unsigned)time(NULL));
a = (int *)malloc(start_num - end_num + 1);
for (i = start_num; i < end_num + 1; i++)
{
a[i - start_num] = i;
}
for (i = start_num; i < end_num + 1; i++)
{
temp = a[i - start_num];
rand_index = rand() % (end_num - start_num + 1);
a[i - start_num] = a[rand_index];
a[rand_index] = temp;
}
for(i = 0; i < end_num - start_num + 1; i++)
printf("%d ", a[i]);
printf("\n");
free(a);
a = NULL;
return 0;
}
其中最主要的算法是:首先生成一个从[start_num, end_num]的数组,这样就会保证数组里面的数不会重复,那么如何使这个数组的排好的序随机呢?这里的解决办法是使用rand()来生成一个随机数组序号,使用自增的方式遍历整个数组,然后交换rand()生成的随机数组序号的a[rand_index]和当前的a[i - start_num],实际上就类似于随机拿一个排好序的序列中的一个数和序列中另一个数交换位置,这样序列就被随机打乱,随机交换的次数当然也可以随机;序列中的数值是不会变的(即不重复);如此便能实现不重复随机数序列;