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

为什么rand()%2/1.0不等于rand()%20/10.0 ???
前者输出的是整型,后者是实数,求解。

  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<time.h>
  #include<stdlib.h>
  #include<stdio.h>
  
  
  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);
  }
  }
  

  
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-08-12
范围是0~32767。
库函数中系统提供了两个函数用于产生:srand()和rand()。 原型为:
函数一:int rand(void);
返回一个[0,RAND_MAX]间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。
第2个回答  2013-10-31
因为精度 前者精度没有丢失 而后者精度丢失
切 前者只用 0.0 和1.0 后者 有0.0 0.1 0.2 ... ... 1.9 由于精度 后者的小数为很多大于一位
第3个回答  2013-10-31
应该都是实数吧,“/1.0”、“/10.0”起码决定了输出是实数,当然显示上如果是整数会舍去小数点。追问

真不一样= =

追答

rand()是随机数函数,当然每次答案不一样啊。。。。。= =
即使你把rand()先付给变量,但是计算顺序是先求余数,除以2和除以20余数是不一样的。。。= =
。。。。。。。

追问

前面的只会输出1或0,后者就会出现1.1或1.3什么的

追答

你前者除以2求余数,余数可能0、1。再除以1,一定是1或0了。。。。
后者除以20 求余数,余数小于20,再除以10 ,一定在1到2之间了。。。。= =

这其实是个数学问题。。。。。。

追问

百分号是不超过的意思。。即生成不超过2的随机数。。。。

追答

你确定。。。c++ 里不是整数求余吗?

是啊。。。rand()/2整个含义是“生成不超过2的随机数”,但百分号是整数求余啊。。。多看看基础。

而且c++里rand()只能得到随机整数,所以可以用百分号。百分号两边只能是整数。

追问

额额,兄弟这个可能真的是你错了啊= =这个百分号不是取余的意思呢

追答

好吧。但希望你编程的同时多看看数学,编程只是手段,算法才是核心。

追问

谢谢你了

本回答被网友采纳
第4个回答  2013-10-31
// crt_rand.c
// This program seeds the random-number generator
// with the time, then exercises the rand function.
//

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void SimpleRandDemo( int n )
{
// Print n random numbers.
int i;
for( i = 0; i < n; i++ )
printf( " %6d\n", rand() );
}

void RangedRandDemo( int range_min, int range_max, int n )
{
// Generate random numbers in the half-closed interval
// [range_min, range_max). In other words,
// range_min <= random number < range_max
int i;
for ( i = 0; i < n; i++ )
{
int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
+ range_min;
printf( " %6d\n", u);
}
}

int main( void )
{
// Seed the random-number generator with the current time so that
// the numbers will be different every time we run.
srand( (unsigned)time( NULL ) );

SimpleRandDemo( 10 );
printf("\n");
RangedRandDemo( -100, 100, 10 );
}
给你看份SDK里的代码你就懂了追问

能不能简单点,几句话概述一下,我还是个新新新新新手。。

相关了解……

你可能感兴趣的内容

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