在网上查随机数生成,大家基本都是大同小异的,而且还不是很方便(这个如果你只是想要生成一个随机数什么的,那也无所谓,还能凑合着用那种方法)。
用C++写的,但是C要用就把 ctime写成time.h ,cstdlib写成stdlib.h
C++的随机数生成本质上是用C的库实现的,你看库名字就知道了....
但是不够好的是,如果如果我要生成多个随机数的时候,那么我就要设置一个种子,srand,一般呢,就是用时间去波动它。导致时序不同的地方生成一个的随机数。
一般代码如下:(熟手的话,很容易就打完下面的代码了)
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int RandNumber(int begin = 0, int end = 1) {
return (rand()%(end-begin+1))+begin;
}
int main(){
srand(time(0));
for (int i = 0; i < 10; ++i){
cout << RandNumber(1,5)<<endl;
}
return 0;
}
但是仔细看的话,发现这样其实是不够好的
这个不够好,是在代码格式上的。
要是进行一个大的规模的的程序。你放一个种子在main函数或者其他什么函数中,这样肯定是不好的嘛!(在逻辑上过不去,打码久了就能很容易体会到这一点)
这样封装起来就不够严密了嘛。
所以呢?好的解决方法是什么呢?
我想到了一个,就是构建一个类。
为什么要构建类呢?
对于每一个类,都可以在构造函数中构建一次随机数种子。
这样,由于一个随机数种子会对应一个随机数。再由于时间在波动,所以,就可以更新随机数。
同样可以增加代码的重用。可以说是一个非常好的程序员思维。
举个反例,一般对随机数不太熟的人都会遇到生成的随机数是相等的
典型错误就包括下面这种(下面代码确保了重用但是....)
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int RandNumber(int begin = 0, int end = 1) {
srand(time(0));
return (rand()%(end-begin+1))+begin;
}
int main(){
for (int i = 0; i < 10; ++i){
cout << RandNumber(1,5)<<endl;
}
return 0;
}
虽然你确实生成了一个随机数,但是不得不说的是,你每次生成的随机数都是一样的.....
像上面那个代码运行的结果,每次都可能是1到5之间的任意的一个数,但输出的这个10个数都是一样的....对比第一代码,可以看出srand的位置的不同(虽然长得有点像)
但是用类就没有这方面的考虑了。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
class RandomNumber{
public:
RandomNumber(){
srand(time(0));
}
int get(int begin = 0, int end = 1){
return rand()%(end-begin+1)+begin;
}
};
int main(){
RandomNumber r,t;
for (int i = 0; i < 10; ++i) {
cout << r.get(1, 5)<<" "<< t.get(1, 5)<< endl;
}
}
为了确保自己设计没有问题,我还特意写了两个变量来运行。
这样说可以做了一个重用的随机数了。
(而我这个代码,就有点生成器的味道了(接触过Python的朋友应该能感受到))
要是有小哥哥愿意做一个输入流,这样就可以做一个很酷的像int一样的类,直接cout,可以说是非常酷了。
上面就是之前那个代码的运行结果。