vc环境下c语言怎么生成随机数能给个0-100之间的程序最好了…标签:rand,语言,int,srand,生成,种子,随机数,time From: https://blog.51cto.com/yetaotao/5789768
r = ( (double)rand() / ((double)(RAND_MAX) (double)(1)) );
请问如何用C语言写随机数产生器?给个代码谢谢!
一个可移植的rand 和srand 的实现方法
ststic long next= 1;
int rand(void ) //RAND_MAX= 32767
next= next* 1103515245+ 12345;
return (int) (next/ 65536)% 32768;
void srand(int seed)
next= seed;
C语言中怎样生成随机数?
C语言生成
为rand。
rand(void);
stdlib.h
获取一个非负随机
注意事项:
rand是
,由一个种子计算得来。
如果种子相同,每次启动
,获取到的
是固定的。
可以通过srand设置当前时间作为种子,使随机效果更好。
srand(time(NULL));
要获取[m,n]范围的随机数,可以使用代码
rand()%(n-m+1)+m例子如下
如果我们想得到一个
0-60的随机数那么可以写成
这样就OK了,简单;
i=rand()%60;
i=rand()%60;
srand((unsigned)time(
)),否则得到的随机数就是一个固定数
2:srand()
里的值必须是动态变化的:
当然最好有个统一的标注如下;
就可以了,省事:其实可以不用写srand()
,只用rand()就可以了,rand()根据种子而产生随机数
1,提供每次获得随机数的基数而已在VC中设计到随机数有两个函数
srand()
rand()
srand()
的作用是是一个种子在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了。在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了。利用时间再附加一些算法,可以达到效果
rand()的结果每次一样,不好用RANDOM()函数
在
文件里
此函数产生的是0-1之间的随机数
C语言中获得随机数的方法
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
例如:#include
#include
void main()
for(int i=0;i<10;i+)
printf("%d\n",rand());
}(2) 如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:例如:随机生成10个0~100的数:
#include
#include
#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
例如:
#include
#include
#include
#define random(x) (rand()%x)
void main()
{srand((int)time(0));
for(int x=0;x<10;x++)
printf("%d\n",random(100));
}这样两次运行的结果就会不一样了!!问题1: 怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。
专家解答:
之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。
问题2: 我按照上述方法并不能产生随机数,仅产生公差为3或4的等差数列:
#include
#include
#include
#include
void main()
{
for(int i=0;i<100000;i++)
{
srand( (unsigned)time( NULL ) );
cout<
}
}
专家解答:
你的程序是有问题的,你每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。你应该把srand放在循环外:
srand( (unsigned)time( NULL ) );
for(int i=0;i<100000;i++)
{
//相关语句
}可以使用库函数rand()。
rand声明于stdlib.h,其原型为
int rand(void);
功能为返回一个随机整型值。在C语言中,该值是一个正数值。
在需要限定获取到的随机数范围时,如范围要求为[m,n] m
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]。在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。
有关如何产生随机数的理论有许多,如果要详细地讨论,需要厚厚的一本书的篇幅。不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。
下面讲一讲在c语言里所提供的随机数发生器的用法。现在的c编译器都提供了一个基于ansi标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
这个过程看起来很简单,问题是如果你每次调用srand()时都提供相同的种子值,那么,你将会得到相同的随机数序列,这时看到的现象是没有随机数,而每一次的数都是一样的了。例如,在以17为种子值调用srand()之后,在首次调用rand()时,得到随机数94。在第二次和第三次调用rand()时将分别得到26602和30017,这些数看上去是很随机的(尽管这只是一个很小的数据点集合),但是,在你再次以17为种子值调用srand()后,在对于rand()的前三次调用中,所得的返回值仍然是在对94,26602,30017,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此只有再次给srand()提供一个随机的种子值,才能再次得到一个随机数。用随机数函数要区分编程环境。TC和VC(VC代表win32编译器)是不同的。TC下用以下两个函数初始化随机数产生器void randomize(void)产生随机数(max表示 产生从0~max-1的随机数)
int random(int max)例子:int main(){ int rand; randomize(); rand=random(10)+1; /*产生1~10的随机数*/}vc下也有两个函数 srand(unsigned long seed) 用于初始化随机数,参数为随机数种子,一般使用当前时间作为随机数种子。 unsigned long rand(void)返回一个随机数,范围可用取余运算控制。例子:#include
int main(){ int a; srand(time(0));//time(0)以秒为单位。 a=rand()%10+1;//产生1~10的随机数}在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了。