很好奇的随机函数rand()君

在函数速查上看到的rand()君:

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3
 4 int main(void)
 5 {
 6    int i;
 7
 8    printf("Ten random numbers from 0 to 99\n\n");
 9    for(i=0; i<10; i++)
10       printf("%d\n", rand() % 100);
11    return 0;
12 } 

可产生十个随机数。

开始不理解的地方:rand()%100什么意思?→%100可以保证输出的随机数大小在100之内,算是二次处理。

但是随机数产生的原理呢?因为计算机不像是可以真的随机产生些什么的工具。

果然rand()也只是个伪随机数发生器。我找到的原理解释如下:

→产生整数rand的原理是:

y=ax+b(mod   n)其中,n一般是一个很大的素数,几万。

a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,

他被称为seed。

每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,

虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。

为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t

在CPP上有一段代码,大概就是上述原理咯:

 1 #include<stdio.h>
 2  int rand0(void);
 3 int main()
 4 {
 5  int i;
 6   for(i=0;i<5;i++)
 7    printf("%hd\n",rand0());
 8  return 0;
 9 }
10
11 /*rand0()函数*/
12 static unsigned long int next=1;//next是种子
13 int rand0(void)
14 {
15   next=next*1103515245+12345;
16   return (unsigned int)(next/65536)%32768;
17 }

输出:

跟书上一摸一样啊……而且无论运行几次都是一模一样的一组数据。这是因为每次运行都是从同一个种子值next=1开始的,要得到不同组的随机数,还要用一个srand1()函数来重置种子值。

时间: 2024-11-14 16:14:22

很好奇的随机函数rand()君的相关文章

C++ 中随机函数 rand() 和 srand() 的用法

C++教程这篇文章给大家讲述的是:C++ 中随机函数 rand() 和 srand() 的用法! 一.rand() 函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned in

随机函数rand()和srand()

C++中随机函数rand()和srand()的用法 一.rand() 函数名:   rand     功   能:   随机数发生器   用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned int 双字节是

认识随机函数rand()和srand(unsigned int )

随机函数rand /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) / / Author: Nicolas Hery - http://nicolashery.com / / Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff / / Source: https://github.com/nicolahery/markdownpad-github */ /* RESET ==

随机函数rand()算法

今天学习了一下随机函数rand的算法. 这个算法叫做线性同余算法(linear congruential generator (LCG)). 不同的编译器取的常数不同,可以参考wiki:http://en.wikipedia.org/wiki/Linear_congruential_generator 以下程序可以输出和系统一样的随机数. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 #define _A 214013LL 6 #

C++中随机函数rand()和srand()的用法

一.rand() 函数名:   rand 功   能:   随机数发生器 用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned int 双字节是65535,四字节是4294967295的整数范围.0~RAND

awk之随机函数rand()和srand() (转)

转自:http://blog.chinaunix.net/uid-10540984-id-2942041.html 文件: 1234567 abcdefg ...... 现在想要随机抽取5列组成下面的内容,允许重复: 36612 cffab ...... awk -F '' 'BEGIN{srand();for(i=1;i<=5;i++)a[i]=int(rand()*100%7+1)}{for(i=1;i<=5;i++)printf $a[i];printf RS}' file [解析] 思

C++中rand()函数的用法

C++中rand()函数的用法   2011-12-30 11:03:59|  分类: C / C++|举报|字号 订阅 一.C++中不能使用random()函数 random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过.但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数. 可改用C++下的rand函数来实现. 1.C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数. RAND_MAX必须至少为

细谈中医-------很老很老的偏方

中医皮肤科老偏方 解决皮肤的烦心事儿 皮肤是人体对抗疾病的第一道防线一定要严防死守. 在广义上皮肤科包含对头发.指趾甲疾病的治疗.本 章所列举的都是日常生活中最常见的皮肤病用小偏方治疗既轻 松又有效. 读客家庭健康必备书 001 1劝君放弃洗发液用洋葱.生姜治头皮屑 症状头皮屑 很老很老的老偏方 ①将一个捣烂的洋葱头用纱布包好用它揉擦头皮24 小时后用温水洗头即可止头痒除头皮屑. ②先将生姜切片放入锅里煮沸待水温不烫的时候倒 上适量醋加水洗头. 头皮屑谁都不会陌生.有些头皮屑比较多的人即使头皮痒

SQL中随机数函数rand()简介

转自:http://database.51cto.com/art/201009/224397.htm 下文将为您介绍SQL中的随机函数rand(),供您参考,如果您是才接触SQL Server的新手,不妨一看,相信对您学习SQL中的函数会大有帮助. 在SQL Server中,有个随机函数rand(),有不少新手可能不知道存在这个函数,现在我就把这个函数的一些随机数生成技巧写出来,这是面向菜鸟的,老鸟请不要拍砖呀,我的头还不够硬 不过还是希望老鸟们多多指教了,现在切入正题:  随机函数:rand(