C++ 如何在C+;中生成均匀随机整数而不重复+;
我想生成一个随机整数,它遵循均匀分布,不重复。例如,我将用这段代码生成6个统一的数字C++ 如何在C+;中生成均匀随机整数而不重复+;,c++,g++,visual-studio-2015,C++,G++,Visual Studio 2015,我想生成一个随机整数,它遵循均匀分布,不重复。例如,我将用这段代码生成6个统一的数字 vector<int> container; container.reserve(lossNum); std::vector<unsigned int>::iterator it; // Our Random Generator std::mt19937 eng{ std::random_device{}() }; int max_num=6 for (int i = 0;
vector<int> container;
container.reserve(lossNum);
std::vector<unsigned int>::iterator it;
// Our Random Generator
std::mt19937 eng{ std::random_device{}() };
int max_num=6
for (int i = 0; i<max_num; i++) {
unsigned int q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
do {
q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
it = std::find(container.begin(), container.end(), q);
} while (it != container.end());
container.push_back(q);
}
向量容器;
集装箱储备(lossNum);
std::vector::it迭代器;
//我们的随机发生器
std::mt19937 eng{std::random_device{}()};
int max_num=6
对于(int i=0;i
代码示例
看看你的代码,它看起来像是你重新发明了轮子。MSVC 2015应该支持std::shuffle
,这样你就可以用它做同样的事情:
int max_num = 6;
// Create vector
std::vector<int> container(max_num);
// Fill it with numbers 0, 1, ..., max_num - 1)
std::iota(container.begin(), container.end(), 0)
// Create random engine generator
std::mt19937 eng{ std::random_device{}() };
// shuffle it!!
std::shuffle(container.begin(), container.end(), eng);
int max_num=6;
//创建向量
标准::向量容器(最大数量);
//用数字0、1、…、max_num-1填充)
std::iota(container.begin()、container.end()、0)
//创建随机引擎生成器
std::mt19937 eng{std::random_device{}()};
//洗牌!!
std::shuffle(container.begin(),container.end(),eng);
所有肮脏的事情都是你干的,不是你干的
随机性
是否确实要在[0,6]中生成6个数字?
为什么7号不能全部拥有呢
我在我的计算机上测试了您的代码,重复了120000次,我:
0丢失了17335次
1缺失16947次
2缺失17054次
3缺失17116次
4号失踪17330次
5丢失了17114次
6缺失17105次
这里看起来是统一的,但我使用g++。可能是msvc std库有问题,但我不能提供更多信息,因为我不使用它
代码示例
看看你的代码,看起来你重新发明了轮子。MSVC 2015应支持std::shuffle
,因此您可以对以下各项执行相同的操作:
int max_num = 6;
// Create vector
std::vector<int> container(max_num);
// Fill it with numbers 0, 1, ..., max_num - 1)
std::iota(container.begin(), container.end(), 0)
// Create random engine generator
std::mt19937 eng{ std::random_device{}() };
// shuffle it!!
std::shuffle(container.begin(), container.end(), eng);
int max_num=6;
//创建向量
标准::向量容器(最大数量);
//用数字0、1、…、max_num-1填充)
std::iota(container.begin()、container.end()、0)
//创建随机引擎生成器
std::mt19937 eng{std::random_device{}()};
//洗牌!!
std::shuffle(container.begin(),container.end(),eng);
所有肮脏的事情都是你干的,不是你干的
do {
q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
it = std::find(container.begin(), container.end(), q);
} while (it != container.end());
do{
q=std::均匀分布{0,max_num}(英文);
it=std::find(container.begin(),container.end(),q);
}while(it!=container.end());
您正在拾取一个图元,如果之前已经选择了该图元,则将其拒绝。从计算角度来看,这是一个禁忌
你想要的是一种叫做Knuth shuffle(又名Fisher-Yates shuffle)的东西。
这种算法允许您随机选取向量的元素(这里是一个包含6个数字[0;6[)的向量),而无需替换
“费舍尔-耶茨洗牌类似于从帽子中随机挑选编号的票子(组合数学:可分辨的对象),直到没有票子为止,不进行替换。”在
选举权代码:
#include <stdlib.h>
/* Arrange the N elements of ARRAY in random order.
Only effective if N is much smaller than RAND_MAX;
if this may not be the case, use a better random
number generator. */
void shuffle(int *array, size_t n)
{
if (n > 1) {
size_t i;
for (i = 0; i < n - 1; i++) {
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
int t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
#包括
/*按随机顺序排列数组的N个元素。
仅当N远小于RAND_MAX时有效;
如果情况并非如此,请使用更好的随机变量
数字发生器*/
无效洗牌(整数*数组,大小\u t n)
{
如果(n>1){
尺寸i;
对于(i=0;i
永远不要这样做:
do {
q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
it = std::find(container.begin(), container.end(), q);
} while (it != container.end());
do{
q=std::均匀分布{0,max_num}(英文);
it=std::find(container.begin(),container.end(),q);
}while(it!=container.end());
你正在选择一个元素,如果你之前已经选择了它,那么就拒绝它。从计算角度来说,这是不允许的
你想要的是一种叫做Knuth shuffle(又名Fisher-Yates shuffle)的东西。
这种算法允许您随机选取向量的元素(这里是一个包含6个数字[0;6[)的向量),而无需替换
“费舍尔-耶茨洗牌类似于从帽子中随机挑选编号的票子(组合数学:可分辨的对象),直到没有票子为止,不进行替换。”在
选举权代码:
#include <stdlib.h>
/* Arrange the N elements of ARRAY in random order.
Only effective if N is much smaller than RAND_MAX;
if this may not be the case, use a better random
number generator. */
void shuffle(int *array, size_t n)
{
if (n > 1) {
size_t i;
for (i = 0; i < n - 1; i++) {
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
int t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
#包括
/*按随机顺序排列数组的N个元素。
仅当N远小于RAND_MAX时有效;
如果情况并非如此,请使用更好的随机变量
数字发生器*/
无效洗牌(整数*数组,大小\u t n)
{
如果(n>1){
尺寸i;
对于(i=0;i
由于文本中没有“random”一词,container.push_back(i)
就可以了。对不起,一定是这样random@user8430我不知道这有什么帮助,但您连续两次请求一个随机数-在do while
循环之前和循环中。尝试声明unsigned int q;
而不将其初始化为随机数。可能会有帮助。因为您没有“random”这个词在文本中,container.push_back(i)
就可以了。对不起,一定是这样random@user8430我不知道这有什么帮助,但是你连续两次请求一个随机数-在do while
循环之前和循环中。尝试声明unsigned int q;
,而不将其初始化为随机数。可能会有帮助。你能向g++展示上面的代码吗?我想在Ubu中构建它ntuI认为所有的代码都已经存在。如果你想使用std::shuffle
,上面的代码应该可以完成这项工作。否则,我用do…while循环测试了你的代码。