注册 登录
编程论坛 C++教室

std::shuffle不理解

rohalloway 发布于 2018-11-19 14:12, 3105 次点击
下面是我的函数
目的:向vector的对象v中添加480个元素,前100个元素=10,v[99]-v.end()之间的元素都是0;

我的想法是利用shuffle随机打乱v中的元素,来实现地雷的位置随机
程序代码:

void Widget::initVector()
{
    for(int i = 0; i < 480; i++)
    {
        if(i < 99)
            v.push_back(10);
        else
            v.push_back(0);
    }

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);
}


现在的问题是,这个函数每次的打乱序列都是一样的,如:
只有本站会员才能查看附件,请 登录


可以看到,地雷的位置随机成功了,但是每次运行程序,位置都是一样的。

查询https://zh.中的例子



程序代码:

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";

    system("pause");
}


这段示例程序正常,为什么我的每次打乱后的顺序都是一样的?

cppreference上的说明有点看不懂,请帮我看看哪里有问题,还有关于shuffle的使用方法,谢谢!

[此贴子已经被作者于2018-11-19 14:16编辑过]

3 回复
#2
rjsp2018-11-19 15:01
先提醒一下,你第二段程序不是来自 ,因为你私自加了料“system("pause");”。
这种行为不好(虽然我知道你不是故意的),会使别人误以为代码中使用 system("pause") 是一种可接受的正常用法。

回正题,一个可能是,你编译器使用的C++库中的 std::random_device 并不是真的 非确定性随机数发生器。
如果是这样,那么只能不用 std::random_device 了,将
std::random_device rd;
std::mt19937 g(rd());
改为
std::mt19937 g( time(NULL) );

#3
rjsp2018-11-19 15:14
这是关于此bug的讨论:https://
#4
rohalloway2018-11-19 15:19
以下是引用rjsp在2018-11-19 15:01:31的发言:

先提醒一下,你第二段程序不是来自 ,因为你私自加了料“system("pause");”。
这种行为不好(虽然我知道你不是故意的),会使别人误以为代码中使用 system("pause") 是一种可接受的正常用法。

回正题,一个可能是,你编译器使用的C++库中的 std::random_device 并不是真的 非确定性随机数发生器。
如果是这样,那么只能不用 std::random_device 了,将
std::random_device rd;
std::mt19937 g(rd());
改为
std::mt19937 g( time(NULL) );


按照版主的指导完美的解决了问题。

我使用vs来测试某些功能,成功后再用Qt Creator写上正确的代码,

就是您说的编译器问题,这两个IDE的编译器不一样。




system("pause");这个是我自己后加的,
我使用vs练习时,每次都要加这个,不然看不到cmd的窗口,所以平时就用Qt来写控制台,Qt不用加这个

谢谢老大!
1