如何在不重复一个数字多次的情况下生成一个范围之间的随机数
How can I generate a random number between a range without repeating a number more than once?
我想给对象的变量分配一个随机数,对于对象,随机数不应该与任何其他对象的变量匹配。
我已经编写了代码来生成一个范围之间的随机数,但它重复。所以,我想要一个解决方案。
根据您需要的索引范围,有多种解决方案。
如果它很小,只需生成所有值的矢量并对其进行洗牌
std::vector<size_t> indices(index_count);
std::iota(indices.begin(), indices.end(), 0);
std::random_shuffle(indices.begin(), indices.end()); // Or std::shuffle with custom RNG.
下一个解决方案是存储到目前为止生成的索引。
std::unordered_set<size_t> indices;
size_t generate(std::unordered_set<size_t>& indices) {
while (true) {
size_t index = ...; // Generate a possibly repeating index.
if (indices.insert(index).second) { // .insert(...).second checks whether the value is new in set.
return index;
}
}
}
最后一种解决方案是使用伪随机数生成器,该生成器可以在数学上证明不会重复(直到一些大量调用(。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- 在 c 中给定一个固定数的情况下,找到所有可能的加法和组合(给定一个总和,找到它的可能的加法和排列
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++在不使用pow或循环的情况下计算一个数字的幂
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 如何在没有运算符>>的情况下从字符串流返回下一个令牌?
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 是否可以在不扩展初始宏的情况下将一个宏作为参数提供给另一个宏?
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 有什么理由在没有继承的情况下声明一个虚拟方法
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 尝试创建一个读取.txt文件,显示它,计数唯一单词的程序,并在使用了多少次的情况下显示独特的单词.C