C语言中获得随机数的方法

作者&投稿:爱新觉罗梁 (若有异议请与网页底部的电邮联系)
C语言中取随机数的函数~

1. 基本函数

在C语言中取随机数所需要的函数是:

   int rand(void); void srand (unsigned int n);

rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件:

   #include



2. 使用方法

rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。

srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。

举个例子,假设我们要取得0~10之间的随机整数(不含10本身):

   /* 例1:不指定种子的值 */
   for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
    每次运行都将输出:1 7 4 0 9 4 8 8 2 4
   /* 例2:指定种子的值为1 */
   srand(1); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
    每次运行都将输出:1 7 4 0 9 4 8 8 2 4
    例2的输出结果与例1是完全一样的。
   /* 例3:指定种子的值为8 */ srand(8); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
    每次运行都将输出:4 0 1 3 5 3 7 7 1 5
    该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。
   /* 例4:指定种子值为现在的时间 */ srand((unsigned)time(NULL)); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
    该程序每次运行结果都不一样,因为每次启动程序的时间都不同。另外需要注意的是,使用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) 其他情况,以此类推,这里不作详细说明。

随机数主要有两个函数
一个种子产生函数
void
srand(int);
一个随机数产生函数
int
rand();
当我们要产生随机数的时候,首先我们生成一个随机数种子(注意相同的种子产生的随机数序列是一样的)
然后使用rand()函数得到随机数
祝你好运

C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
例如:#include<stdio.h>
#include<stdlib.h>
void main()
{
for(int i=0;i<10;i+)
printf("%d\n",rand());
} (2) 如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:例如:随机生成10个0~100的数:
#include<stdio.h>
#include<stdlib.h>
#define random(x) (rand()%x)

void main()
{
for(int x=0;x<10;x++)
printf("%d\n",random(100));
} (3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。srand()函数定义 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值来当做seed
如果你用time(0)的话,要加入头文件#include<time.h>例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)

void main()
{ srand((int)time(0));
for(int x=0;x<10;x++)
printf("%d\n",random(100));
}这样两次运行的结果就会不一样了!!

可以使用库函数rand()。
rand声明于stdlib.h,其原型为

int rand(void);
功能为返回一个随机整型值。在C语言中,该值是一个正数值。

在需要限定获取到的随机数范围时,如范围要求为[m,n] m<n且m,n均为整数,可以用
rand()%(n-m+1)+m
的形式进行获取。原理为:
%为取余计算,当%k时,结果是[0,k-1]之间的数值;
于是rand()%(n-m+1) ∈ [0, n-m];
所以rand()%(n-m+1)+m ∈ [0+m, n-m+m]=[m,n]。

问题1: 怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。

专家解答:

之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。

问题2: 我按照上述方法并不能产生随机数,仅产生公差为3或4的等差数列:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
void main()
{
for(int i=0;i<100000;i++)
{
srand( (unsigned)time( NULL ) );
cout<<rand()<<endl;
}
}
专家解答:
你的程序是有问题的,你每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。你应该把srand放在循环外:
srand( (unsigned)time( NULL ) );
for(int i=0;i<100000;i++)
{
//相关语句
}

C语言生成随机数需要用到两个函数,一个是srand(),一个是rand(),首先给srand()提供一个种子,unsigned int类型,其取值范围从0~65535,srand()根据这个种子会由一个特定的公式生成一个随机数序列;然后调用rand(),它会依次从这个序列中返回一个数(在0到32767之间),而在不指定srand()种子的情况下,它每次都使用默认的种子,因此生成的序列是同一个,你每次运行,当然就取到相同的数字了。

你可以在程序里添加头文件time.h,用当前时间作为srand的种子,这样就能保证每次运行时都能取到不同的随机数序列。如下:
time_t t;
srand((unsigned) time(&t));
然后就可以用rand()取随机数了。

在VC中设计到随机数有两个函数

srand() and rand()

srand() 的作用是是一个种子,提供每次获得随机数的基数而已,rand()根据种子而产生随机数

注意

1:srand() 里的值必须是动态变化的,否则得到的随机数就是一个固定数

2:其实可以不用写srand() ,只用rand()就可以了,省事,简单,例子如下

如果我们想得到一个 0-60的随机数那么可以写成

int i;

i=rand()%60;

就可以了。

当然最好有个统一的标注如下:

int i;

srand((unsigned)time( NULL ));

i=rand()%60;

这样就OK了。


C语言中获得随机数的方法是什么?
可以使用库函数rand()。rand声明于stdlib.h,其原型为 int rand(void);功能为返回一个随机整型值。在C语言中,该值是一个正数值。在需要限定获取到的随机数范围时,如范围要求为[m,n] m<n且m,n均为整数,可以用 rand()%(n-m+1)+m 的形式进行获取。原理为:为取余计算,当%k时,结果是...

C语言生成随机数的函数,为什么循环后随机数都一样?
srand()函数是初始化随机数产生器,它产生随机数种子,说白了就是初始化随机数。srand((unsigned)time(0));取的是系统时间,也就是距离1970.1.1午夜有多少秒。而for循环每循环一次时间远远小于1秒,这就导致了srand((unsigned)time(0))产生的种子并没有改变。 那么,相同的随机数种子所产生的随机...

c语言,如何产生随机数?
本文由青松原创并依GPL-V2及其后续版本发放,转载请注明出处且应包含本行声明。\\x0d\\x0a\\x0d\\x0aC++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的...

如何在C语言中生成一定范围内的随机数?
srand((int)time(NULL));设定随机数种子rand()%100;产生0-99的随机数。高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到)。其他情况如法炮制!C语言中用rand()函数产生20-90的随机整数 20-90共有71个数字,所以是rand()%71+20 ;用rand(...

如何用c语言产生一定范围内的随机数?
利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子...

C语言中怎样生成随机数?
srand() 的作用是是一个种子,提供每次获得随机数的基数而已,rand()根据种子而产生随机数注意1:srand() 里的值必须是动态变化的,否则得到的随机数就是一个固定数2:其实可以不用写srand() ,只用rand()就可以了,省事,简单,例子如下如果我们想得到一个 0-60的随机数那么可以写成int i;i=rand()%60;就可以了...

c语言中,有多少中生成随机数的方法,哪种最好?
方法1:使用srand函数;srand函数又有两种不同的使用方法:直接输入随机数种子和使用系统时间初始化随机数种子;例:使用系统时间输入随机数种子产生10个随机数:include <stdlib.h> include <stdio.h> include \/*用到了time函数,所以要有这个头文件*\/ define MAX 10 int main( void){ int number[...

怎么在vc++6.0中用C语言产生随机数?
1、rand返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。2、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时...

利用C语言中随机函数rand(),随机产生10个从0~9的随机数,分别统计奇数与...
您好,很高兴为您作答。要应用C语言编写所需程序,可以参考以下的思路:引入头文件stdlib.h和time.h,分别用于调用rand()函数和设置随机数种子。定义两个整型变量odd和even,分别用于存储奇数和偶数的个数,初始值为0。用srand()函数设置随机数种子为当前时间,这样可以保证每次运行程序时产生不同的随机...

在c语言中怎样随机给变量赋值?
在C语言中,获取随机数的函数为rand()1、声明:int rand(void);2、头文件:stdlib.h;3、功能:获取一个随机数。4、示例:int a = rand();\/\/获取一个随机数并赋值给a;int b = rand()%100;\/\/获取一个0~99的随机数,并赋值给b。C语言 C语言是一门通用计算机编程语言,应用广泛。C语言...

富顺县18740584245: 如何在C语言中生成一定范围内的随机数? -
邰诸协诺: srand((int)time(NULL));设定随机数种子 rand()%100;产生0-99的随机数. 高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到).其他情况如法炮制!C语言中用rand()函数产生20-90的随机整数 20-90共有71个数字,所以是rand()%71+20 ; 用rand()生成-20-20的随机数 -20-20共有41个数字,所以是rand()%41-20; 需要注意的是,在运行以上代码之前最好设定一下: srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样

富顺县18740584245: 怎么用C语言生成随机数? -
邰诸协诺: 生成1~13的随机数,随机数序列中没有重复字数 #include <stdio.h> #include <stdlib.h> // 包含rand()函数说明 #include <time.h> #define N 13 void main( void ) { inti, j, num[N], tmp; //用当前时间种子重置随机数生成器,使每次运行生成不同的...

富顺县18740584245: C语言中怎样生成随机数? -
邰诸协诺: 在VC中设计到随机数有两个函数 srand() and rand() srand() 的作用是是一个种子,提供每次获得随机数的基数而已,rand()根据种子而产生随机数 注意1:srand() 里的值必须是动态变化的,否则得到的随机数就是一个固定数2:其实可以不用写srand() ,只用rand()就可以了,省事,简单,例子如下 如果我们想得到一个 0-60的随机数那么可以写成 int i; i=rand()%60; 就可以了.当然最好有个统一的标注如下:int i; srand((unsigned)time( NULL )); i=rand()%60; 这样就OK了.

富顺县18740584245: 如何用c语言产生一定范围内的随机数 -
邰诸协诺: C语言的获取随机数的函数为rand(), 可以获得一个非负整数的随机数.要调用rand需要引用头文件stdlib.h. 要让随机数限定在一个范围,可以采用模除加加法的方式. 要产生随机数r

富顺县18740584245: c语言如何产生在一定范围内的随机数 -
邰诸协诺: //---------------------------------------------------------------------------#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int a;int t=10,d=100;srand(time(NULL)); /*初始化随机数种子*/ a=rand()%(d-t)+t; /*生成一个[t,d)区间内的整数*/...

富顺县18740584245: 怎样用c语言产生一个0到100的随机数 -
邰诸协诺: rand()函数,头文件stdlib.hint num; num = rand()%100;

富顺县18740584245: c语言怎么产生随机数(1~6) -
邰诸协诺: 系统的函数是产生0~32767的随机数,将这个数对六取余得到0~5的随机数,再+1就是1~6的随机数了 假如随机数的函数是a() 就这样写:a()%6+1

富顺县18740584245: c语言中,有多少中生成随机数的方法,哪种最好? -
邰诸协诺: 1.可能用到的函数:randomize(),srand(),rand(),random().◎void randomize(void)通过time函数来得到一个随机数,此数将成为起始发生数据(stdlib.h | time.h)◎void srand(unsigned number)该函数和rand函数配合使用,产生随机...

富顺县18740584245: 如何在c语言中取0 - 99之间的随机数,而且不能重复 -
邰诸协诺: 到底要取多少抄个是很重要的.如果就取几个袭, 那碰上相同的冲取就可以了.如果要取很多很多, 那么重取的方案就不划算了. 比如如果要取100次, 也就是做个全排列, 可以做个表, 每次从表中取数,取完了就把它从表里删除.#...

富顺县18740584245: c语言中如何随机生成一个 1 到 2千万 的数 -
邰诸协诺: 1 C语言产生随机数函数.rand(); 头文件为stdlib.h 2 产生[m,n]范围内随机数的语句: rand()%(n-m+1)+m 3 要产生不同随机数范围的方法: 将已获取的随机数保存下来,在产生新的随机数后,与已获取到的进行比较,如果存在则抛弃,否则...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网