我已经看到了基于std::random_shuffle
创建未重复随机数向量的方法,但是我需要实现一种替代方法。这是我的代码:
std::vector<int> create_unrepeated_random(int v_size, int v_max) {
// Max index value must be grater than the number of vector size
assert(v_max > v_size);
std::vector<int> ret;
int val = 0;
for (int i = 0; i < v_size; i++) {
val = std::rand() % v_max;
// Keep generating new values until we generate one that is not already in
// output vector
if (ret.size() > 0) {
while (!std::binary_search(ret.begin(), ret.end(), val)) {
val = std::rand() % v_max;
}
}
ret.push_back(val);
}
assert ((int)ret.size() == v_size);
for (auto &v: ret) printf("%d ", v);printf("\n");
return ret;
}
然而,这不起作用,不知道为什么。有些数字有时会被重复。
但如果我将while
循环更改为
while (std::binary_search(ret.begin(), ret.end(), val))
这会创建一个重复随机数的向量。这有什么不对?
答案 0 :(得分:4)
std::binary_search
仅适用于已排序的范围。请改用std::find
:
while (std::find(ret.begin(), ret.end(), val) != ret.end())
或者,您可以使用std::unordered_set
:
std::unordered_set<int> ret;
while (ret.size() < v_size) {
ret.insert(rand() % v_max);
}
请记住,使用这种方法,生成的数字的顺序将是未指定的,即可能比矢量方法更不随机。如果您想要一个排序的随机数序列,请考虑std::set
。
备注:在现代C ++中不鼓励使用rand()
,尽管它可能会对玩具程序起作用。另请参阅https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful