VC++如何产生随机数

来源:百度知道 编辑:UC知道 时间:2024/09/23 00:25:53
我想做个逻辑猜数的程序,要产生四位的随机数,不要那种用时间作为随机数的种子,这话会有一定规律性,在几秒钟内连续运行程序的话,一般百位和千位不变,所以不好,我要完全无规律的随机数,大家帮帮忙。
怎么精确到毫秒,不明白。复杂的运算又怎样做?
还有什么可以作为随机数的种子,举个例子。

#include "math.h"
#define GetRandom(min,max) ((rand()%(int)(((max)+1)-(min)))+(min))
//生成min ,max 之间的随机数
//如果要产生4位数的可以min=1000,max=9999 就可以了,下面给出用例

//产生12个随机数
for (p=0; p<12; p++) {

float f1 = (float) GetRandom(1000, 9999) + ((float) GetRandom(1, 150) / 100.0F);//生成随机数

}

计算机是不能产生真正的随机数的,都是伪随机的。
就用时间做为种子,精确到毫秒就行了。
或者做一些复杂运算,比如上次产生的随即数取正弦,除以现在的时间,再平方作为下次的种子数。

API函数GetTickCount可以精确到毫秒。

复杂的运算比如说,你用现在的时间(精确到毫秒)除以鼠标所在的位置(比如鼠标的X坐标乘以Y坐标),这个结果再取正弦,然后让这个数做为种子,这个应该没问题了吧。

程序调用srand和rand产生的随机数,只要种子一样,那么产生的结果肯定是一样的.就如楼上所说,他是伪随机的.
所以你在使用时间作为种子时,只要播一次种子就可以了.

一般情况下,以上随机函数是够用的.

当然你在取得随机数设置种子时,还可以比如得到当前鼠标的位置等参数.取得与用户行为相关的参数,加上时间做一下运算,这样可以使结果更随机.
为了取得一个随机数,你可以选择把两次随机的结果进行叠加.

既然百位千位变化不大就不要用了

int a = rand() % 100;
int b = rand() % 100;
int c = a * 100 + b;

c就是你想要的四位数
--------------------------
一般用srand(time(0));设置