【C】初学习之库函数——通用的实用工具<stdlib.h>之伪随机序列生成函数
来源:互联网 发布:怎么自己开淘宝网店 编辑:程序博客网 时间:2024/06/07 07:11
rand函数和srand函数都可以用来生成伪随机数。(用于模拟程序和玩游戏程序)
(1)rand函数——随机数发生器
每次调用rand函数,会返回一个0—RAND_MAX(<stdlib.h>中定义的宏)的数字。rand函数返回的数字是由“种子”产生的,所以实际上其返回的数值并不是真正的随机数。但对于偶然的观察者来说.rand函数似乎能产生不相关的数值序列。
用法:int rand(void) ;
(2)srand函数——初始化种子值
调用srand函数可以为rand函数提供种子值。如果在srand函数之前调用rand函数。那么会把种子值定为1。每个种子确定一个特定的伪随机序列,用户可以自己选择数值序列。
用法:void srand(unsigned int seed);
(3)time函数——产生和时间有关的随机种子
始终使用同一种子值会使得rand函数得到相同的数值序列,但是如果用户想模拟随机序列,即每次得到不同的序列,即必须使种子值“随机化”。最简单的方式是调用time函数。它返回一个对当前时间编码后得到的数值,并返回传递给srand函数,这样rand函数每次运行的时间都不相同。
用法:srand ((unsigned int) time (NULL));
(4)产生一定范围通用随机数范围的通用公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
下面看两个例子:
(1)测试伪随机序列生成函数
// Tests the pseudo-random sequence generation functions#include#include int main(void) {int i, seed;printf("This program displays the first five values of rand.\n");for (;;) {for (i = 0; i < 5; i++)printf("%d ", rand());printf("\n\n");printf("Enter new seed value(0 to terminate): ");scanf_s("%d", &seed);if (seed == 0)break;srand(seed);}getch();return 0;}
该程序首先返回rand函数的前5个值,然后用户选择新的种子值,遇到0程序结束。从运行程序结果来看,我们可知选择1为种子值和不指定种子值所得的数列相同。
(2)模拟“扎金花”游戏发牌,得到三张牌的结果(利用time函数生成随机种子)
// Tests the pseudo-random sequence generation functions#include#include #include #define Cards 12#define Colors 4int straight(int a[3]);int main() {int card[3];int color[3];srand((unsigned)time(NULL));for (int i = 0; i < 3; i++) {card[i]= rand() % Cards + 1;color[i] = rand() % Colors + 1;switch (color[i]){case 1: printf("The %d cards is spade %d\n", i+1,card[i]); break;case 2: printf("The %d cards is heart %d\n", i+1, card[i]); break;case 3: printf("The %d cards is club %d\n", i+1, card[i]); break;case 4: printf("The %d cards is diamond %d\n", i+1, card[i]); break;}}if ((color[0] == color[1]) && (color[1] == color[2]))printf("golden flower !\n");else if ((card[0] == card[1]) && (card[1] == card[2]))printf("leaopord !\n");else if ((card[0] == card[1]) || (card[1] == card[2]) || (card[0] == card[2]))printf("pair !\n");else if (straight(card) == 1)printf("straight!\n");elseprintf("single!\n");getch();return 0;}int straight(int a[3]) {int max=a[0], min=a[2];for (int i = 0; i < 3; i++) {if (a[i] > max){max = a[i];}if (a[i] < min) {min = a[i];}}if (max - min == 2) { return 1; }else { return -1; }}
- 【C】初学习之库函数——通用的实用工具<stdlib.h>之伪随机序列生成函数
- 通用函数stdlib.h
- C标准库源码解剖(14):通用函数stdlib.h
- C/C++中生成随机序列——随机函数的选择和自我实现
- 库函数(备忘)--stdlib.h
- C语言函数库——stdlib.h
- C运行库函数介绍(stdio.h stdlib.h)【转】
- stdlib.h包含的函数
- C语言的常用库函数(dos)之四(dir.h文件下的一些函数)
- 【转】C/C++中stdlib.h头文件下的库函数
- c/c++中stdlib.h头文件下的库函数(转载)
- C语言使用stdlib.h库函数的二分查找和快速排序程序
- C语言库函数stdlib.h里面都包含什么
- C语言标准工具库函数库:stdlib.h
- c语言 stdlib库函数
- Linux C学习笔记 —— 字符串转换函数(stdlib.h)
- c语言知识 stdlib.h常用函数
- C库函数手册---math.h、stdlib.h、string.h、float.h
- left join 连表时,on后多条件无效问题
- OpenLayers 加载静态图片
- jQuery学习笔记6
- 关于升级swif3.0的一些东西(续)
- AngularJS系列之select下拉选择第一个选项为空白的解决办法
- 【C】初学习之库函数——通用的实用工具<stdlib.h>之伪随机序列生成函数
- Http与网络通信(GET和POST方式)
- 求最短路即次短路模板,一条边可以重复走的HDU6181
- [笔记分享] [OS] Linux的时间管理
- leetcode75: Sort Colors
- R语言对高频交易订单流进行建模分析 1
- weex 学习历程
- 报错`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map`instead
- 1015:大小写问题