| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2214 人关注过本帖
标题:关于随机种子的问题
取消只看楼主 加入收藏
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:3 
关于随机种子的问题
程序代码:
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
#include <algorithm>
#include <random>
using namespace std;

class A{
public:
    static string getName();
};

string A::getName(){
    vector<string> v1{ "","", "", "", "", "", "", "", "", "" };
    vector<string> v2{ "","", "", "", "", "", "", "", "", "" };
    vector<string> v3{ "","", "", "", "", "", "", "", "", "" };
    vector<int> v{ 0,1,2,3,4,5,6,7,8,9 };

    random_device rd;
    mt19937 g(rd());
    shuffle(v.begin(), v.end(), g);

    return v1[v[0]] + v2[v[1]] + v3[v[2]];
}
int main()
{
    for (int i = 0; i < 20; i++)
    {
        cout << A::getName() << endl;
    }

    system("pause");
    return 0;
}


此代码段在vc下可以正确获得20个随机中文名
可能的输出:
程序代码:
/*
赵晓强 张世强 王世明 王世   周小新
安志新 李佳   吴月明 周明强 赵佳锋
张世林 赵志艳 赵明强 吴明林 周晓红
郑志锋 高其红 张晓锋 周晓   吴玉
*/



在mingw下,20个结果全部一样。
我尝试将
random_device rd;
mt19937 g(rd());
更改为
std::mt19937 g(time(NULL));

但问题没有得到解决,请问mingw下应该如何设置随机数种子才能解决这个问题,谢谢
搜索更多相关主题的帖子: 随机 include vector string int 
2018-11-28 16:56
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:0 
程序代码:
string A::getName(){
    std::vector<std::string> v1{ "","", "", "", "", "", "", "", "", "" };
    std::vector<std::string> v2{ "","", "", "", "", "", "", "", "", "" };
    std::vector<std::string> v3{ "","", "", "", "", "", "", "", "", "" };
    std::vector<int> v{ 0,1,2,3,4,5,6,7,8,9 };

    static QTime t = QTime::currentTime();
    QTime T = QTime::currentTime();

    int i = T.msecsTo(t);

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

    return v1[v[0]] + v2[v[1]] + v3[v[2]];
}


利用毫秒的差值做随机种子时,会出现运行速度太快而存在重复结果的问题,如:

程序代码:
/*
张明
张明
张明
张明
张明
张明
张明
张明
高小林
高小林
高小林
高小林
高小林
高小林
高小林
高小林
安月明
安月明
安月明
安月明
*/
2018-11-28 17:21
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:0 
程序代码:
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
#include <algorithm>
#include <random>
#include <QTime>
#include <set>
using namespace std;

class A{
public:
    static string getName();
};

string A::getName(){
    std::vector<std::string> v1{ "","", "", "", "", "", "", "", "", "" };
    std::vector<std::string> v2{ "","", "", "", "", "", "", "", "", "" };
    std::vector<std::string> v3{ "","", "", "", "", "", "", "", "", "" };
    std::vector<int> v{ 0,1,2,3,4,5,6,7,8,9 };

    static QTime t = QTime::currentTime();
    QTime T = QTime::currentTime();

    int i = T.msecsTo(t);

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

    return v1[v[0]] + v2[v[1]] + v3[v[2]];
}
int main()
{
    set<std::string> se;
    while(true)
    {
        se.insert(A::getName());
        if(se.size() == 20)
            break;
    }

    for(auto s : se)
        std::cout << s << endl;

    return 0;
}


此代码段在mingw下可以正确的获取20个不重复的随机中文名,
可能的输出:
程序代码:
/*
安明
安月明
高小林
高月强
李世
李晓
李小强
王明
王小锋
王玉
张明
赵佳锋
赵明
赵世林
郑明红
郑小新
周明
周玉明
周月新
周志
*/

存在2楼提到的“会出现运行速度太快而存在重复结果的问题”,我使用set容器过滤掉了。
总算是勉强实现了需求:)


如果您有好的办法解决1楼的问题,请帮助我,谢谢

[此贴子已经被作者于2018-11-28 17:32编辑过]

2018-11-28 17:30
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:0 
以下是引用Jonny0201在2018-11-28 18:10:09的发言:

把随机引擎设为 static?
string get_name() {
    vector<string> v1{ "张","王", "李", "赵", "周", "吴", "郑", "王", "安", "高" };
    vector<string> v2{ "小","晓", "明", "月", "佳", "志", "其", "世", "玉", "丽" };
    vector<string> v3{ "明","新", "锋", "", "林", "红", "艳", "", "强", "" };
    static default_random_engine e(time(nullptr));
    uniform_int_distribution<decltype(v1.size())> u(0, v1.size() - 1);
    return v1 + v2 + v3;
}



在mingw下测试正确,非常感谢!


以下内容摘自网络,分享给遇到同样问题的朋友:

c/c++老版本的rand()存在一定的问题,在转换rand随机数的范围,类型或者分布时,常常会引入非随机性。

定义在<random> 中的随机数库通过一组协作类来解决这类问题:随机数引擎 和 随机数分布类

一个给定的随机数发生器一直会生成相同的随机数序列。

一个函数如果定义了局部的随机数发生器,应该将(引擎和分布对象)定义为 static 的。否则每次调用函数都会生成相同的序列。
2018-11-30 04:37
快速回复:关于随机种子的问题
数据加载中...
 
   



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

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