首页 > 编程知识 正文

rand取随机数,c++随机函数rand使用方法

时间:2023-05-06 20:02:44 阅读:135294 作者:3070

在实际编程中,贪蛇游戏中食物出现在随机位置,扑克牌游戏中随机出牌等,往往需要生成随机数。

在c语言中,一般使用头文件中的rand ) )函数生成随机数,其用法如下。

输入(void );

void表示不需要传递参数。

c语言也有可获取随机数的random (函数,但random )不是标准函数,VC/VS等编译器无法通过,所以很少使用。

rand ) )随机生成0到rand _ max之间的整数。

RAND_MAX是头文件中的宏,表示rand ()返回的最大随机数。 C语言标准没有规定RAND_MAX的具体数值,但至少规定了32767的值。 在实际编程中,不需要知道RAND_MAX的具体值,可以当作大的数来处理。

随机数生成的例子如下所示。

#包含

#包含

int main ()。

int a=rand (;

printf(%d(n ),a );

返回0;

}

运行结果示例:

193

随机数的本质

如果多次运行上面的代码,您会发现每次出现的随机数都是相同的。 这是怎么回事呢? 为什么随机数不是随机的呢?

实际上,rand ()函数中出现的随机数是伪随机数,是根据某个数值或某个公式估计的。 这个数值称为“种子”。 种子和随机数的关系是正态分布,如下图所示。

每次启动计算机时种子都是随机的,但计算机启动后种子不再变化,这意味着每次启动计算机时种子都是固定值。 因此,根据表达式估计的结果(即生成的随机数)是固定的。

重播种子

我们可以用srand ()函数重新“播种”。 那样的话,物种就会改变。 srand ) )的使用方法如下。

voidsrand(unsignedintseed );

需要unsigned int型的参数。 在实际开发中,时间可以作为参数。 如果每次播种的时间不同,生成的物种不同,最终的随机数也不同。

可以使用头文件中的time ()函数获取当前时间(以秒为单位),如下所示:

srand () unsigned (time ) ) null );

感兴趣的读者可以猛击这里,点击time (请自己研究函数的使用方法。 本节不多赘述。

修改以上代码,在生成随机数之前进行种子。

#包含

#包含

#包含

int main ()。

int a;

srand () unsigned (time ) ) null );

a=rand (;

printf(%d(n ),a );

返回0;

}

如果多次运行程序,您会发现每次生成的随机数都不一样。 但是,这些随机数有逐渐增大或减少的趋势。 这是因为我们以时间为种子,时间会逐渐增大,结合上面的正态分布图,很容易推测随机数也会逐渐增大或减少。

生成一定范围内的随机数

在实际开发中,往往需要一定范围的随机数,过大或过小都不符合要求。 那么,如何生成一定范围的随机数呢? 我们可以利用取模的方法:

inta=rand( (; 产生//0~9的随机数,注意10能被整除

规定上下限时:

inta=rand(Q13; 产生13~63的随机数

分析:取模就取余。 rand(q13可以认为是两个部分。 rand ) q产生0到50之间的随机数。 后13保证a最小只有13,最大50 ) 13=63。

最后给出产生13~63范围内随机数的完整代码:

#包含

#包含

#包含

int main ()。

int a;

srand () unsigned (time ) ) null );

a=rand(Q13;

printf(%d(n ),a );

返回0;

}

连续生成随机数

有时需要一组随机数(多个随机数),该如何生成呢? 一个容易想到的解决方案是使用循环,在每次循环时重新播种。 请看下面的代码。

#包含

#包含

#包含

int main ()。

int a,I;

使用//for循环生成10个随机数

for(I=0; i 10; I ) {

srand () unsigned (time ) ) null );

a=rand (;

printf('%d ',a );

}

返回0;

}

运行结果示例:

8 8 8 8 8 8 8 8 8 8

执行结果非常奇怪,每次循环我们都再次撒下了种子呢。 为什么生成的随机数是相同的?

这是因为for循环的执行速度非常快,可以在一秒钟内完成执行,但time ()函数得到的时间只精确到秒钟,因此每个循环得到的时间相同。 于是,种子也一样,随机数也一样。

那么,怎样才能解决呢? 没有连续生成随机数的方法吗? 当然,我们将在《C语言连续生成多个随机数》节给出巧妙的解决方案。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。