简单的随机数生成采用rand()函数就可以得到:1
int rv= rand() % UpperBound;
这样得到的随机数,每次运行都一样,我们可以加一个srand(),使每次运行产生的数都不一样1
srand((int)time(0));
但是这样避免不了产生相同的数值,下面是我运行两次的结果:1
21 7 4 0 9 4 8 8 2 4
5 5 1 7 1 1 5 2 7 6
如果你运气好,甚至可能出现十个相同的数。在彩票的场景下,这样的计算是允许的;但是在抽奖的场景下,这样的计算显然是不合适的。
下面的代码是使用bitset跟踪生成的随机数,以实现返回不同的随机数。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using namespace std;
template <size_t UpperBound> class Urand
{
private:
bitset<UpperBound> used;
public:
Urand()
{
srand(time(0));
}
size_t operator()()
{
if(used.count() == UpperBound)
used.reset();
size_t newval;
while(used[newval = rand() % UpperBound])
;
used[newval] = true;
return newval;
}
};
int main()
{
Urand<10> ur;
for(int i=0;i<10;i++)
{
cout << ur() << " ";
}
cin.get();
return 0;
}
运行结果如下:1
9 5 8 1 2 0 6 3 7 4