C和C随机数或字符串生成源码图文稿
c语言随机生成乘法口诀

c语言随机生成乘法口诀下面是使用C语言随机生成乘法口诀的示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 初始化随机种子
int i, j;
int max_number = 9; // 表示乘法口诀表中最大的数,本例设置为9
for (i = 1; i <= max_number; i++) {
for (j = 1; j <= max_number; j++) {
int result = i * j;
// 生成随机颜色
int color = (rand() % 7) + 31;
// 在控制台打印乘法口诀表
printf("\033[%dm%d x %d = %2d ", color, i, j, result);
}
printf("\n");
}
return 0;
}
以上代码可以生成一个随机颜色的乘法口诀表,每行包含1到
9的乘法表达式。
通过调整max_number变量的值,可以控制生成乘法口诀的最大数。
颜色可以通过\033[数字m序列来设置,其中31表示红色,32表示绿色,以此类推。
c语言中有关随机函数的使用详解

c语言中有关随机函数的使用详解在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是voidsrand(inta)。
可能大家都知道C语言中的随机函数random,可是random函数并不是ANSIC标准,所以说,random函数不能在gcc,vc等编译器下编译通过。
rand()会返回一随机数值,范围在0至RAND_MAX间。
返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。
在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
一般用for语句来设置种子的个数。
具体见下面的例子。
一如何产生不可预见的随机序列呢利用srand((unsignedint)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。
在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。
它们就是rand()和srand()函数。
这二个函数的工作过程如下:1)首先给srand()提供一个种子,它是一个unsignedint类型,其取值范围从0~65535;2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3)根据需要多次调用rand(),从而不间断地得到新的随机数;4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
随机数生成原理 实现方法 不同编程语言的随机数函数

1-0:Microsoft VC++产生随机数的原理:Srand ( )和Rand( )函数。
它本质上是利用线性同余法,y=ax+b(mod m)。
其中a,b,m都是常数。
因此rand的产生决定于x,x被称为Seed。
Seed需要程序中设定,一般情况下取系统时间作为种子。
它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。
1-1:线性同余法:其中M是模数,A是乘数,C是增量,为初始值,当C=0时,称此算法为乘同余法;若C ≠0,则称算法为混合同余法,当C取不为零的适当数值时,有一些优点,但优点并不突出,故常取C=0。
模M大小是发生器周期长短的主要标志,常见有M为素数,取A为M的原根,则周期T=M-1。
例如:a=1220703125a=32719 (程序中用此组数)a=16807代码:void main( ){const int n=100;double a=32719,m=1,f[n+1],g[n],seed;m=pow(2,31);cout<<"设置m值为"<<m-1<<endl;cout<<"输入种子"<<endl; //输入种子cin>>seed;f[0]=seed;for(int i=1;i<=n;i++) //线性同余法生成随机数{f[i]=fmod((a*f[i-1]),(m-1));g[i-1]=f[i]/(m-1);cout.setf(ios::fixed);cout.precision(6); //设置输出精度cout<<i<<" "<<'\t'<<g[i-1]<<endl;}}结果分析:统计数据的平均值为:0.485653统计数据的方差为:0.3205761-2:人字映射递推公式就是有名的混沌映射中的“人字映射”或称“帐篷映射”,它的非周期轨道点的分布密度函数:人字映射与线性同余法结合,可产生统计性质优良的均匀随机数。
C# Random随机函数使用方法

C# Random随机函数使用方法随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。
本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数,并通过此文介绍Visual c#中随机数的用法。
.net.Frameword中提供了一个专门产生随机数的类System.Random,此类默认情况下已被导入,编程过程中可以直接使用。
我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。
我们可以用以下两种方法初始化一个随机数发生器;函数是这样用,比如100至999的随机数Random ran=new Random();int RandKey=ran.Next(100,999);不过这样会有重复,可以给Random一个系统时间做为参数,以此产生随机数,就不会重复了第一种方法不指定随机种子,系统自动选取当前时前作随机种子:Random ra=new Random();第二种方法是指定一个int型的参数作为随机种子:int iSeed=6;Random ra=new Random(iSeed);下面我们要用到Random.Next()方法产生随机数。
ra.Next();它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。
public virtual int Next(int);用法:ra.next(20)返回一个小于所指定最大值(此处为20)的正随机数。
public virtual int Next(int minValue, int maxValue);用法:ra.next(1,20)返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。
C++真随机数生成方法

C++真随机数⽣成⽅法引⾔⼤家都知道<stdlib.h>⾥⾯的rand和srand()函数吧?他们其实是伪随机数⽣成器,⽣成的随机数有周期性,⽽且取决于随机种⼦。
那么如何⽣成真随机数呢?下⾯我来讲⼀下两个系统下的⽣成⽅法。
正⽂Windows 系统代码这个WinRandom类调⽤了系统的加密秘钥⽣成器,这个⽣成器调⽤内核⽣成秘钥,所以是硬件的真随机数。
#include <windows.h>#include <wincrypt.h>class WinRandom {HCRYPTPROV handle;public:WinRandom() {handle = NULL;CryptAcquireContext((HCRYPTPROV*)&handle,NULL,NULL,PROV_RSA_FULL,0);}~WinRandom() {if (handle != NULL) CryptReleaseContext(handle, 0);}bool randBuf(void *dest, int len) {if (handle == NULL) return false;return CryptGenRandom(handle, len, (BYTE*)dest);}# define _(func, typ) \typ func() { \typ ret = 0; \assert(randBuf((void *)&ret, sizeof(ret))); \return ret; \}_(randInt, int)_(randLong, long long)_(randUnsigned, unsigned)_(randUnsignedLong, unsigned long long)_(randShort, short)_(randUnsignedShort, unsigned short)_(randChar, char)_(randUnsignedChar, unsigned char)_(randSignedChar, signed char)};使⽤姿势WinRandom R;printf("Unsigned: %u\nLong long: %lld\n",R.randUnsigned(),R.randLong());就是这样,还不⽤srand,是不是很⽅便啊?很适合做数据⽣成器!注意:请不要在⽐赛时使⽤!注意:请不要在⽐赛时使⽤!注意:请不要在⽐赛时使⽤!要在⽐赛时使⽤请看下⽅【通⽤】Linux 系统由于 Linux 系统⾃带了/dev/random,所以请使⽤ STL。
c++中随机生成一定范围数字的函数

《C++中随机生成一定范围数字的函数》在C++编程中,随机生成一定范围的数字是一项常见且重要的任务。
在许多应用程序和游戏中,我们需要使用随机数来创建各种各样的场景和功能,例如生成随机地图、随机敌人出现、随机事件发生等等。
编写一个能够生成指定范围内随机数字的函数是非常有用的。
在本文中,我将探讨如何使用C++编程语言来实现一个可以随机生成一定范围数字的函数。
我将针对这个主题从简到繁地进行讨论,以帮助读者更深入地理解这一技术。
1. 使用rand函数生成随机数我们可以使用C++标准库中的rand()函数来生成随机数。
这个函数会返回一个介于0和RAND_MAX之间的整数值,但我们通常需要的是一个指定范围内的随机数。
我们需要将rand()生成的随机数映射到我们需要的范围内。
2. 使用取余操作和偏移来限定范围一种简单的方法是使用取余操作和偏移来将生成的随机数映射到指定范围内。
如果我们需要在1到100之间生成随机数,我们可以使用以下代码:```cppint randomNum = rand() % 100 + 1;这段代码将生成一个介于1和100之间的随机数,并且保持了均匀分布的特性。
3. 编写一个通用的函数为了使这个功能更加灵活和可重用,我们可以编写一个通用的函数来生成指定范围内的随机数。
这个函数应该接受最小值和最大值作为参数,并返回一个介于这两个值之间的随机数。
以下是一个简单的示例代码:```cppint randomInRange(int min, int max) {return rand() % (max - min + 1) + min;}```通过这个函数,我们可以在任何需要的地方轻松地生成指定范围内的随机数。
总结回顾通过本文的讨论,我们深入了解了在C++中实现随机生成一定范围数字的函数。
我们首先介绍了使用rand()函数生成随机数的基本方法,然后讨论了如何使用取余操作和偏移来限定范围,最后编写了一个通用的函数来实现这一功能。
c 随机函数

c 随机函数一、前言C语言中的随机函数是我们经常用到的一个函数,它可以生成一个随机数,为我们的程序增加了一定的灵活性和随机性。
本文将详细介绍C语言中的随机函数。
二、什么是随机数随机数是指在一定范围内按照一定规律产生的数列中任意取出一个数。
在计算机领域中,随机数是由计算机程序根据某种算法生成的符合特定要求的数字序列。
三、C语言中的随机函数C语言中提供了rand()函数和srand()函数来生成伪随机数。
下面分别介绍这两个函数。
1. rand()函数rand()函数用于生成一个[0,RAND_MAX]之间的伪随机整数。
其中RAND_MAX是stdlib.h头文件中定义的常量,表示rand()能够返回的最大值。
2. srand() 函数srand() 函数用于初始化伪随机数发生器。
如果不调用srand() 函数,则每次调用 rand() 函数时都会得到同样的结果。
四、使用示例下面给出一个简单示例来演示如何使用rand()和srand() 函数:#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){int i, j;srand((unsigned) time(NULL)); // 初始化种子for (i = 0; i < 10; i++) {j = rand();printf("%d\n", j);}return 0;}上述代码中,我们使用了time()函数来获取当前时间,然后将其作为srand()函数的参数来初始化随机数发生器。
接着使用for循环调用rand()函数生成10个随机数并输出。
五、如何提高随机性1. 改变种子如果每次生成伪随机数时都使用相同的种子,则每次生成的序列都是相同的。
因此,要想生成不同的序列,需要在每次程序运行时改变种子。
2. 使用更复杂的算法C语言中默认使用线性同余算法来产生伪随机数。
C++随机数(rand和srand)函数用法详解

C++随机数(rand和srand)函数⽤法详解c++随机数C++ 提供了⼀组函数以⽣成和使⽤随机数字。
随机数字就是从⼀组可能的值中进⾏随机选择⽽获得的⼀个值。
该组中的值都有相同的被选中的⼏率。
C++ 库有⼀个名为 rand() 的函数,每次调⽤该函数都将返回⼀个⾮负整数。
要使⽤ rand() 函数,必须在程序中包含 cstdlib 头⽂件。
以下是其⽤法⽰例:randomNum = rand();但是,该函数返回的数字其实是伪随机数。
这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是⽤算法⽣成的。
该算法需要⼀个起始值,称为种⼦,以⽣成数字。
如果没有给出⼀个种⼦,那么它将在每次运⾏时产⽣相同的数字流。
下⾯的程序说明了这⼀点://This program demonstrates what happens in C++ if you// try to generate random numbers without setting a "seed".#include <iostream>#include <cstdlib>// Header file needed to use randusing namespace std;int main(){// Generate and printthree random numberscout << rand() << " ";cout << rand() << " ";cout << rand() << endl ;return 0;}第1次运⾏输出结果:41 18467 6334第2次运⾏输出结果:41 18467 6334要在每次运⾏程序时获得不同的随机数字流,则必须为随机数⽣成器提供⼀个种⼦以开始。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C和C随机数或字符串生成源码文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]1. 基本函数在C语言中取随机数所需要的函数是:rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件:2. 使用方法rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。
RAND_MAX常量被定义在stdlib.h头文件中。
其值等于32767,或者更大。
srand()函数使用自变量n作为种子,用来初始化随机数产生器。
只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。
因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。
如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。
每次运行都将输出:1 7 4 0 9 4 8 8 2 4每次运行都将输出:1 7 4 0 9 4 8 8 2 4例2的输出结果与例1是完全一样的。
每次运行都将输出:4 0 1 3 5 3 7 7 1 5该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。
该程序每次运行结果都不一样,因为每次启动程序的时间都不同。
另外需要注意的是,使用time()函数前必须包含头文件time.h。
3. 注意事项求一定范围内的随机数。
如要取[0,10)之间的随机整数,需将rand()的返回值与10求模。
randnumber =rand()% 10;那么,如果取的值不是从0开始呢你只需要记住一个通用的公式。
要取[a,b)之间的随机整数(包括a,但不包括b),使用:(rand() % (b - a)) + a伪随机浮点数。
要取得0~1之间的浮点数,可以用:rand() / (double)(RAND_MAX)如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法: rand() /((double)(RAND_MAX)/100)其他情况,以此类推,这里不作详细说明。
当然,本文取伪随机浮点数的方法只是用来说明函数的使用办法,你可以采用更好的方法来实现。
举个例子,假设我们要取得0~10之间的随机整数(不含10本身):大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。
其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。
计算机只能生成相对的随机数,即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。
怎样理解呢产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。
比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。
从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。
那么计算机中随机数是怎样产生的呢有人可能会说,随机数是由“随机种子”产生的。
没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。
那么随机种子是从哪里获得的呢下面看这样一个C程序:static unsigned int RAND_SEED;unsigned int random(void){RAND_SEED=(RAND_SEED*123+59)%65536;return(RAND_SEED);}void random_start(void){int temp[2];movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp[0];}main(){unsigned int i,n;random_start();for(i=0;i<10;i++)printf("%u\t",random());printf("\n");这个程序(rand01.c)完整地阐述了随机数产生的过程:首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣:movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);这个函数用来移动内存数据,其中FP_SEG(far pointer to segment)是取temp数组段地址的函数,FP_OFF(far pointer to offset)是取temp数组相对地址的函数,movedata函数的作用是把位于0040:006CH 存储单元中的双字放到数组temp的声明的两个存储单元中。
这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED。
random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:RAND_SEED = (RAND_SEED*123+59)%65536;是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。
我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。
现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。
那么,随机种子为什么要在内存的0040:006CH 处取0040:006CH处存放的是什么学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,它与Intel8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的。
在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的: TIMER_LOW DW ;地址为 0040:006CH TIMER_HIGH DW ;地址为0040:006EHTIMER_OFT DB ;地址为 0040:0070H时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_LOW处的16位二进制归零,而TIMER_HIGH加一。
rand01.c中的movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。
现在,可以确定的一点是,随机种子来自系统时钟,确切地说,是来自计算机主板上的定时/计数器在内存中的记数值。
这样,我们总结一下前面的分析,并讨论一下这些结论在程序中的应用:1.随机数是由随机种子根据一定的计算方法计算出来的数值。
所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
看下面这个C++程序:在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数都是一样的。
这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。
2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)看下面这个C++程序:这里用户和其他程序没有设定随机种子,则使用系统定时/计数器的值做为随机种子,所以,在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数会是伪随机数,即每次运行显示的结果会有不同。
3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。
for(int i = 0; i < m; i++){//大家看到了,随机种子会随着for循环在程序中设置多次srand((unsigned)time(NULL)*j);//j是后加的外层循环rNum = 1+(int)((rand()/(double)RAND_MAX)*36);//求随机值switch(rNum){case 1: ch[i]='a';break;case 2: ch[i]='b';break;case 3: ch[i]='c';break;case 4: ch[i]='d';break;case 5: ch[i]='e';break;case 6: ch[i]='f';break;case 7: ch[i]='g';break;case 8: ch[i]='h';break;case 9: ch[i]='i'; break;case 10: ch[i]='j'; break;case 11: ch[i]='k'; break;case 12: ch[i]='l'; break;case 13: ch[i]='m'; break;case 14: ch[i]='n'; break;case 15: ch[i]='o'; break;case 16: ch[i]='p'; break;case 17: ch[i]='q'; break;case 18: ch[i]='r'; break;case 19: ch[i]='s'; break;case 20: ch[i]='t'; break;case 21: ch[i]='u'; break;case 22: ch[i]='v'; break;case 23: ch[i]='w'; break;case 24: ch[i]='x'; break;case 25: ch[i]='y'; break;case 26: ch[i]='z'; break;case 27:ch[i]='0'; break;case 28:ch[i]='1'; break;case 29:ch[i]='2'; break;case 30:ch[i]='3'; break;case 31:ch[i]='4';break;case 32:ch[i]='5';break;case 33:ch[i]='6';break;case 34:ch[i]='7';break;case 35:ch[i]='8';break;case 36:ch[i]='9';break;}//end of switchcout<< ch[i];}//end of for loopcout<<endl;delete []ch;return 0;}而运行结果显示的随机字符串的每一个字符都是一样的,也就是说生成的字符序列不随机,所以我们需要把srand((unsigned)time(NULL)); 从for循环中移出放在for语句前面,这样可以生成随机的字符序列,而且每次运行生成的字符序列会不同(呵呵,也有可能相同,不过出现这种情况的几率太小了)。