看到有同事在用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杠一杠吧,它会让着你的。