移动学习网 导航

c++ mfc rand 函数 c++中rand()函数的范围

2024-05-22m.verywind.com
c++ rand()函数怎么用~

rand()%3+1,
在使用rand()前,要设置种子
srand(time(NULL)),比如:
#include #include using namespace std;int main(){srand(time(NULL));int i,j;cout<<"随机10次的结果"<<endl;for (j=0;j<10;j++){i=rand()%3+1;cout<<i<<endl;}}

  rand函数范围:在某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。
  rand函数不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。

  C语言
  srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。
  库函数中系统提供了两个函数用于产生随机数:srand()和rand()。 原型为:
  函数一:int rand(void);
  返回一个[0,RAND_MAX]间的随机整数。
  函数二:void srand(unsigned seed);
  参数seed是rand()的种子,用来初始化rand()的起始值。
  但是,要注意的是所谓的“伪随机数”指的并不是假的随机数。其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。计算机生 成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律,一部份则不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这体现到了事物的特性 —— 差异性;但是每种树的叶子都有近似的形状,这正是事物的共性 —— 规律性。从这个角度讲,我们就可以接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。
  系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的~~
  所以为了避免上述情况的发生我们通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来 产生种子。如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned)time(NULL)*10)
  另外,关于time_t time(0):time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
  srand()、rand()用法举例:

  #include
  #include
  #include
  
  
  void main()
  {
  inti,j;
  srand((int)time(0));
  for(i=0;i<10;i++)
  {
  j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
  printf("%d",j);
  }
  }
  

  

①先说明一下rand,这个函数用来产生伪随机数。比如,产生1000的两个随机数,产生的两个一般上是不同的,但如果要产生80个100以内的随机数,仅用rand函数就不够。因为产生80个100以内的随机数,至少有两个数相等的概率太大了。
②srand函数,并不能使产生的随机数完全不同。你可以执行以下这串代码。
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned)time(NULL));
int t1,t2;
t1=(rand()%3)+1;
t2=(rand()%3)+1;
cout<<t1<<endl<<t2<<endl;
return 0;
}
多执行几次,你会发现也会产生相同的,也就是说,在小范围内产生许多随机数,出现相同随机数的概率会很大。不过,srand的作用只是,在你前后两次执行这串代码时,给你不同的结果而已。
③一般做法:产生随机数时,判断它与已有随机数是否相同,如果相同,再产生一个即可。为了说明问题,我还以产生两个小于三的随机正整数为例。
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
srand((unsigned)time(NULL));//播种子,随时间的不同播不同的种子,故每次产生的随机数都不相同,由于用到time,故需要头函数time.h
int t1,t2;
t1=(rand()%2)+1;
t2=(rand()%2)+1;
myd:if(t2==t1)t2=(rand()%2)+1;
if(t2==t1)t2=(rand()%2)+1;
cout<<t1<<endl<<t2<<endl;
return 0;
}
你会发现这个程序每次都只产生1、2,而不会产生2、2,1、1这两种情况。也许还有其他产生不同随机数的函数,但像你一样,我也试图在网上找过,但没找到。这也是我想到的最简单的方法。
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
srand((unsigned)time(NULL));//播种子,随时间的不同播不同的种子,故每次产生的随机数都不相同,由于用到time,故需要头函数time.h
int t1,t2;
bool error=true;
t1=(rand()%2)+1;
t2=(rand()%2)+1;
while(error)
{
if(t2==t1)t2=(rand()%2)+1;
if(t2==t1)
error=true;//由于上一个语句只是判断当t2=t1时,再产生一个随机数赋给t1,但有可能新产生的这个数还与t1相同,所以接下来还要进行判断
else
error=false;
}
cout<<t1<<endl<<t2<<endl;
return 0;
}
再补充一段代码以便您拿它与上一串代码对比,明白srand函数的用处。
#include<iostream.h>
#include<stdlib.h>
int main(void)
{
int seed;
int t1,t2;
bool error=true;
cin>>seed;//种子由用户输入,如果两次执行这串代码输入相同的种子,执行结果完全相同,否则执行结果不同(即使表面上相同,其实也是不同的执行结果)
srand(seed);
t1=(rand()%2)+1;
t2=(rand()%2)+1;
while(error)
{
if(t2==t1)t2=(rand()%2)+1;
if(t2==t1)
error=true;//由于上一个语句只是判断当t2=t1时,再产生一个随机数赋给t1,但有可能新产生的这个数还与t1相同,所以接下来还要进行判断
else
error=false;
}
cout<<"不同的随机数:"<<endl;
cout<<t1<<endl<<t2<<endl;
return 0;
}
如果您对我的回答有什么疑问,欢迎Hi我!!!恭候1

rand函数是一个伪随机函数,所以值当然就是一样的,你用srand函数就行了,具体使用方法看书,看书印象会更深。

先用srand生成一个随机数种子,这样才会不一样
srand((unsigned)time(NULL));
int n = rand();

xunxunnuaa正解

户户网菜鸟学习
联系邮箱
返回顶部
移动学习网