| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2844 人关注过本帖
标题:std::shuffle不理解
只看楼主 加入收藏
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:3 
std::shuffle不理解
下面是我的函数
目的:向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编辑过]

搜索更多相关主题的帖子: std 元素 end int include 
2018-11-19 14:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
先提醒一下,你第二段程序不是来自 ,因为你私自加了料“system("pause");”。
这种行为不好(虽然我知道你不是故意的),会使别人误以为代码中使用 system("pause") 是一种可接受的正常用法。

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

2018-11-19 15:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
这是关于此bug的讨论:https://
2018-11-19 15:14
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:0 
以下是引用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不用加这个

谢谢老大!
2018-11-19 15:19
快速回复:std::shuffle不理解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022742 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved