善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。

2006-08-28

C随机函数的正确用法

看到有同事在用rand() % 100 + 1这样的方法试图获取一个1~100的随机数。虽然rand()出来的确实是一个整数,而且确实会大于100,但是这样得到的随机数并不是从1~100机率均等的。用在某些场合,不是很合适。

在C中正确的取随机数应该是这样:

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

// 初始化随机数序列
void randomize(void);
{
    srand((unsigned)time(NULL));
    return;
}

// 获得一个0<=x<1之间的随机数(双精度)
double randf(void)
{
    return (double)(rand()) / (RAND_MAX + 1);
}

// 获得一个0<=x<number之间的随机数(整数)
int random(int number)
{
    return (int)(rand() * number / (RAND_MAX + 1) );
}

random之前别忘了先用randomize进行初始化,否则每次出来的随机序列可是一样的。呵呵,用时间值进行初始化也不一定保险,特别是用在博彩系统中,曾有人根据系统启动时间推算出随机数种子的例子。有必要的话,建议各位加上别的因素(比如对鼠标进行采样等)进行随机数种子的初始化工作。


更新于18年以后:

后来有人跟我杠,说rand() % 100 + 1这样写才是对的。
我的确也在很多地方看到有人这样写,甚至包括V2EX。我有点不是很明白,现在程序员的门槛这么低了吗?这些人是不是都是写Web前端的?这已经不是编程问题了,这是数学不及格啊!
往轻了说,你为了性能和开发效率,在业务需求允许的情况下走了「捷径」,起码在心中要有这个X数,而不是来跟我杠说这个写法才是对的。你那么爱杠,去跟AI杠一杠吧,它会让着你的。

没有评论:

发表评论