如何从向量中获取随机和唯一值?
How to get random and unique values from a vector?
可能的重复:
O(1)中的唯一随机数?
C 编程语言中整数数组中的唯一随机数
我有std::vector
一些大小未定的独特元素。我想从这个向量中获取 20 个独特的随机元素。通过"唯一",我的意思是我不想多次获取相同的索引。目前我这样做的方法是打电话给std::random_shuffle
.但这需要我打乱整个向量(可能包含 1000 多个元素)。我不介意改变向量(我宁愿不这样做,因为我不需要使用线程锁),但最重要的是我希望这是有效的。我不应该洗牌太多。
请注意,我已经考虑过将部分范围传递给std::random_shuffle
但它只会洗牌该元素子集,这意味着该范围之外的元素永远不会被使用!
感谢帮助。谢谢!
注意:我使用的是 Visual Studio 2005,因此无法访问 C++11 功能和库。
你可以使用费舍尔耶茨 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Fisher-Yates shuffle(以Ronald Fisher和Frank Yates命名),也称为Knuth shuffle(以Donald Knuth命名),是一种用于生成有限集的随机排列的算法 - 简单来说,用于随机洗牌集合。费舍尔-耶茨洗牌的一种变体,称为萨托洛算法,可用于生成长度为 n 的随机循环。如果实现得当,费舍尔-耶茨洗牌是无偏的,因此每个排列的可能性都相同。该算法的现代版本也相当高效,只需要与被洗牌的项目数量成正比的时间,并且不需要额外的存储空间。 费舍尔-耶茨洗牌的基本过程类似于从帽子中随机挑选编号的彩票,或从一副牌中随机挑选一张,一个接一个,直到没有更多的牌了。特定算法提供的是一种以高效和严格的方式以数字方式执行此操作的方法,如果做得好,可以保证无偏的结果。
我认为这个伪代码应该可以工作(有可能出现一个错误或其他错误,所以仔细检查它!
std::list chosen; // you don't have to use this since the chosen ones will be in the back of the vector
for(int i = 0; i < num; ++i) {
int index = rand_between(0, vec.size() - i - 1);
chosen.push_back(vec[index]);
swap(vec[index], vec[vec.size() - i - 1]);
}
你想要一个来自 n 向量的 m 大小的随机样本:
让兰德(a) 返回 0..a-1 制服
for (int i = 0; i < m; i++)
swap(X[i],X[i+rand(n-i)]);
X[0..m-1]
现在是一个随机样本。
使用循环将随机索引号放入std::set
中,并在size()
达到 20 时停止。
std::set<int> indexes;
std::vector<my_vector::value_type> choices;
int max_index = my_vector.size();
while (indexes.size() < min(20, max_index))
{
int random_index = rand() % max_index;
if (indexes.find(random_index) == indexes.end())
{
choices.push_back(my_vector[random_index]);
indexes.insert(random_index);
}
}
随机数生成是我脑海中浮现的第一件事,随意使用更好的东西。
#include <iostream>
#include <vector>
#include <algorithm>
template<int N>
struct NIntegers {
int values[N];
};
template<int N, int Max, typename RandomGenerator>
NIntegers<N> MakeNRandomIntegers( RandomGenerator func ) {
NIntegers<N> result;
for(int i = 0; i < N; ++i)
{
result.values[i] = func( Max-i );
}
std::sort(&result.values[0], &result.values[0]+N);
for(int i = 0; i < N; ++i)
{
result.values[i] += i;
}
return result;
};
使用示例:
// use a better one:
int BadRandomNumberGenerator(int Max) {
return Max>4?4:Max/2;
}
int main() {
NIntegers<100> result = MakeNRandomIntegers<100, 500>( BadRandomNumberGenerator );
for (int i = 0; i < 100; ++i) {
std::cout << i << ":" << result.values[i] << "n";
}
}
使每个数字的最大大小比最后一个数字小 1。 对它们进行排序,然后按其前面的整数数增加每个值。
模板的东西只是商业外观。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- C++:创建1000次唯一的随机分布,在任何分布中都没有重复的数字
- 生成唯一的随机字符并将其保存在数组中
- 如何将唯一的随机整数插入链表中
- 如何使用 std::shuffle 以随机顺序对具有唯一指针的向量进行洗牌
- 选择6个随机唯一数字
- 如何从向量中获取随机和唯一值?
- 获取C++中的随机唯一整数
- 随机唯一数字数组比较C++
- 在c++中随机生成n以内的唯一数字
- 随机生成唯一整数C++
- 随机生成n个唯一的数字
- 我想得到一组唯一的n*n数组,这些数组在c++中的随机位置只包括0或1