在C语言中通常用srand()与rand()函数来去随机数;
在c语言里面,两个函数包含在<stdlib.h>头文件里面,c++里面,标准库<cstdlib>(被包含于<iostream>中).
srand函数是随机数发生器的初始化函数。
原型:void srand(unsigned seed);
rand函数用来产生随机数,当然是伪随机数。
原型:int rand(void)
seed的作用:srand函数的作用是根据参数seed,设置一个随机起始点,而rand函数根据这个起始点,产生随机数序列。默认的随机种子为1。如果随机种子一样,rand函数所产生的随机序列也一样。
因此,为使每次程序运行都能产生不同的随机序列,每次都应产生一个不同的种子参数。
说明:
因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
返回值:
返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。
0~RAND_MAX每个数字被选中的机率是相同的。
技巧 1:
若要产生指定范围内的随机整数例如 [a, b) 则可以使用: a + rand() % (b - a) 表达式,也即为要产生 [a, b)范围内的随机整数,可以使用 a + rand() % n 表达式,其中 a 为起始值, n 为随机整数取值范围的大小即为 b - a
技巧 2 :
如要产生随机小数,直接将产生的随机整数除以相应次数的10,例:若产生3位的随机小数,则先产生随机整数,然后除以1000即可
实例:
产生1-100以内的随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL));
printf("%d\n",rand()%100 );
return 0;
}
随机分组
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
const char *name[] = {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
};
int len = sizeof(name)/sizeof(name[0]);
int i;
int last = len-1;
srand((unsigned int)time(NULL));//用法固定与rand()一起产生一个随机数
for (i = 0; i < len; i++)
{
int index = rand()%(len);
// 交换
const char *tmp = name[index];
name[index] = name[last];
name[last] = tmp;
last--;
}
// 打印
for (i = 0; i < len; i++)
{
if (i % 4 == 0)
printf ("\n");
printf ("%8s", name[i]);
}
printf ("\n");
return 0;
}