bitset实现无重复随机数生成

简单的随机数生成采用rand()函数就可以得到:

1
int rv= rand() % UpperBound;

这样得到的随机数,每次运行都一样,我们可以加一个srand(),使每次运行产生的数都不一样

1
srand((int)time(0));

但是这样避免不了产生相同的数值,下面是我运行两次的结果:

1
2
1 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
#include <bitset>
#include <vector>
#include <iostream>
#include <ctime>
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

注:bitset用法链接

坚持原创技术分享,您的支持将鼓励我继续创作!