C/C++随机数生成 rand() srand()
来源:互联网 发布:grub2手动引导ubuntu 编辑:程序博客网 时间:2024/05/01 18:05
转载自 http://www.cnblogs.com/caosiyang/archive/2012/07/03/2575236.html
随机数包括伪随机数和物理随机数,我要说的是使用rand()和srand()生成伪随机数,尽管是伪随机,也能满足大部分要求。
#include <stdlib.h>int rand(void);返回一个伪随机数,范围是0-RAND_MAX(尽管实现不同,但至少是32767)void srand(unsigned int seed);设置伪随机数算法的种子
了解随机数的生成,需要从它内部工作原理说起。调用rand()返回的随机数实际上是由一个算法生成的,此算法会生成一个无关联的数字序列,它需要一个种子,根据种子生成相应的数字序列,即种子不同,生成的数字序列也不同。srand()就是用来设置算法种子的。
换一种说法,在你设置种子之时,随机数算法就把数字队列安排好了,每次调用rand(),就好比从序列中pop一个数出来。
如果在调用rand()之前未设置种子,种子默认值是1,建议设置种子,相对安全
写了一个demo看看这两个函数的用法:
test1未设置种子,默认值是1
test2设置种子值为2
test3使用时间设置种子
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>int main() { printf("test1: "); for (int i = 0; i < 10; ++i) { printf("%10d ", rand()); } printf("\n"); printf("test2: "); srand(2); for (int i = 0; i < 10; ++i) { printf("%10d ", rand()); } printf("\n"); printf("test3: "); struct timeval tv; gettimeofday(&tv, NULL); srand(tv.tv_sec + tv.tv_usec); for (int i = 0; i < 10; ++i) { printf("%10d ", rand()); } printf("\n"); return 0;}
连续运行几次的结果如下:
# ./test test1: 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 test2: 1505335290 1738766719 190686788 260874575 747983061 906156498 1502820864 142559277 1261608745 1380759627 test3: 1294573710 1359064005 1136018278 345608164 1963479234 965970445 1138858783 647030683 1547009306 2018312512 # ./test test1: 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 test2: 1505335290 1738766719 190686788 260874575 747983061 906156498 1502820864 142559277 1261608745 1380759627 test3: 1363208023 1758248775 1516950100 1372540572 324153599 1376932489 538519276 357621213 736010851 2085413972 # ./test test1: 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 test2: 1505335290 1738766719 190686788 260874575 747983061 906156498 1502820864 142559277 1261608745 1380759627 test3: 502196104 670340090 1579443138 1827056995 1871508517 1380041528 259014547 1145964334 1044434661 2069585472
可以发现,几次运行结果之间,对应的前两个数字序列是相同的,这是因为使用了相同的种子,而test3每次使用不同的种子,其生成的数字序列也不同。
所以想要使得伪随机数更像物理随机数,设置不同的种子是个好办法,常见的一种方式是使用当前时间,srand(time(NULL))
假如有这样一个需求,在较短时间内生成多个随机字符串,那么我更推荐你使用gettimeofday()获取时间,然后将tv_sec和tv_usec相加作为种子,tv_usec是微妙级别,保证毫秒级的不同时间是无压力的
//random charvoid random_chars(char *buf, uint32_t len) { if (!buf || len == 0) { return; } struct timeval tv; gettimeofday(&tv, NULL); srand(tv.tv_sec + tv.tv_usec); char src[] = "0123456789abcdefghijklmnopqrstuvwxyz"; uint32_t cnt = 36; for (int32_t i = 0; i < len; ++i) { buf[i] = src[rand() % 36]; } }
- C++,rand,srand随机数
- C/C++随机数生成 rand() srand()
- C语言中随机数生成srand() rand()
- C函数 随机数rand() srand()
- C语言区间随机数生成 with srand() & rand() & time()
- C语言区间随机数生成 with srand() & rand() & time()
- srand/rand随机数生成
- rand、srand生成随机数
- c中的随机数产生rand和srand
- C语言中的随机数 srand ( ) 和 rand ( )
- C语言产生随机数 srand rand
- C语言中的随机数 srand ( ) 和 rand ( )
- linux c产生随机数rand(),srand()
- 利用srand,rand产生随机数-C语言
- 随机数生成函数 srand() rand()
- srand与rand随机数生成
- srand()和rand()生成随机数
- C语言区间随机数生成 with srand() & rand() & time() (转)
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- java通用数据库类
- 链表3
- 如何让自己的笔记本电脑成为无线路由器,产生wifi
- UITableView的头 headView
- C/C++随机数生成 rand() srand()
- ASCII 码
- js 递归 返回
- sqlserver脚本时间计算
- Android:异步调用详解
- 怎样才能检测到链表中循环
- 装机工具软件收藏
- I2C协议指东
- android 上传图片