相关疑难解决方法(0)

restrict关键字在C++中的含义是什么?

我总是不确定,在C++中,restrict关键字是什么意思?

是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?

c++ restrict-qualifier

179
推荐指数
5
解决办法
10万
查看次数

如何简洁,便携,彻底地播种mt19937 PRNG?

我似乎看到很多答案,有人建议使用它<random>来生成随机数,通常伴随着这样的代码:

std::random_device rd;  
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);
Run Code Online (Sandbox Code Playgroud)

通常这会取代某种"邪恶的憎恶",例如:

srand(time(NULL));
rand()%6;
Run Code Online (Sandbox Code Playgroud)

我们可能会批评旧的方式,认为time(NULL)提供低熵,time(NULL)可预测,最终结果是不均匀的.

但所有这一切都适用于新的方式:它只有一个更光亮的贴面.

  • rd()返回一个unsigned int.这至少有16位,可能是32位.这还不足以为MT的19937位状态提供种子.

  • 使用std::mt19937 gen(rd());gen()(以32位播种并查看第一个输出)不能提供良好的输出分布.7和13永远不会是第一个输出.两粒种子产生0.十二粒种子产生1226181350.(链接)

  • std::random_device可以(有时是)实现为具有固定种子的简单PRNG.因此,它可能在每次运行时产生相同的序列.(链接)这甚至比time(NULL).

更糟糕的是,尽管存在它们包含的问题,但复制和粘贴上述代码片段非常容易.对此的一些解决方案需要获得可能不适合每个人的大型 .

鉴于此,我的问题是如何在C++中简洁,便携,彻底地播种mt19937 PRNG?

鉴于上述问题,一个很好的答案:

  • 必须完全播种mt19937/mt19937_64.
  • 不能单独依赖std::random_devicetime(NULL)作为熵的来源.
  • 不应该依赖Boost或其他图书馆.
  • 应该适合少量的线条,这样看起来很好,可以复制粘贴到答案中.

思考

  • 我目前的想法是,输出来自std::random_device(可能通过XOR)time(NULL),从地址空间随机化得到的值,以及硬编码常量(可以在分配期间设置)以获得熵的最佳努力.

  • std::random_device::entropy() 没有很好地说明std::random_device可能做什么或不做什么.

c++ random c++11

106
推荐指数
4
解决办法
7189
查看次数

C++ 11中的随机数生成:如何生成,它是如何工作的?

我最近遇到了在C++ 11中生成随机数的新方法,但无法消化我读到的关于它的论文(什么是引擎,数学术语如分布,"所有生成的整数同样可能 ").

所以任何人都可以解释

  • 这些是什么?
  • 他们的意思是什么?
  • 怎么生成?
  • 它们是如何工作的?
  • 等等

您可以在一个有关随机数生成的常见问题解答中调用它.

c++ random c++11

91
推荐指数
2
解决办法
7万
查看次数

为什么不使用random_device?

我对c ++ 11随机库有点困惑.

我的理解:我们需要两个独立的概念:

  • 随机引擎(可以是伪(需要种子)或真实的)
  • 分布:它使用特定的分布将从引擎获得的数字映射到特定的间隔.

我不明白的是为什么不使用这个:

std::random_device rd;
std::uniform_int_distribution<int> dist(1, 5);

// get random numbers with:
dist(rd);
Run Code Online (Sandbox Code Playgroud)

据我所知,这很有效.

相反,这是我在大多数示例/网站/文章中找到的:

std::random_device rd;
std::mt19937 e{rd()}; // or std::default_random_engine e{rd()};
std::uniform_int_distribution<int> dist{1, 5};

// get random numbers with:
dist(e);
Run Code Online (Sandbox Code Playgroud)

我不是在谈论特殊用途,例如加密,只是你的基本入门文章.

我的怀疑是因为std::mt19937(或std::default_random_engine)接受种子,通过在调试会话期间提供相同的种子可以更容易地进行调试.

另外,为什么不呢:

std::mt19937 e{std::random_device{}()};
Run Code Online (Sandbox Code Playgroud)

c++ random c++11

18
推荐指数
3
解决办法
9546
查看次数

C++ 中 random_device 的更好替代品?

我一直在使用random_device rd{}为 Mersenne-Twister 伪随机数生成器生成种子,mt19937 RNG{rd()} 正如此处所建议的那样然而,文档中写道(文档示例代码中的注释),“random_device一旦熵池耗尽,许多实现的性能都会急剧下降。在实际使用中,random_device通常仅用于播种 PRNG,例如mt19937”。我尝试测试这个“熵池”有多大,对于 10^6 次调用,random_device返回超过 10^2 个重复数字(请参阅下面的示例代码和输出)。换句话说,如果我尝试将random_device其用作 Mersenne-Twister PRNG 的种子,它将生成大量重复种子。

问题:人们是否仍在使用random_deviceC++ 来生成 PRNG 种子,或者是否已经有更好的替代方案?

我的代码:

#include <iostream>
#include <random>
#include <chrono>

using namespace std;

int main(){
    
    auto begin = std::chrono::high_resolution_clock::now();
    
    random_device rd{};
    mt19937 RNG{ rd() };

    int total_n_of_calls = 1e6;
    vector<int> seeds;
    
    for(auto call = 0; call < total_n_of_calls; call++){
    int call_rd = rd();
    seeds.push_back(call_rd);
    }
    
    int …
Run Code Online (Sandbox Code Playgroud)

c++ random

6
推荐指数
1
解决办法
1095
查看次数

C++,随机数,范围为1-6

我想知道使用rand()方法得到1-6范围的随机数的方法是什么.这是为了模拟我需要的骰子卷来找到3个骰子卷的平均值,因此类型将是双倍的.

c++ random

5
推荐指数
1
解决办法
2万
查看次数

播种随机数生成器C++

我有两个问题.

  1. 还有什么其他方法可以在不使用C++的情况下为伪随机数生成器播种srand(time(NULL))

  2. 我问第一个问题的原因.我目前正在使用时间作为发电机的种子,但发电机返回的数量始终相同.我很确定原因是因为存储时间的变量在某种程度上被截断了.(我有一条警告信息说,"隐式转换失去整数精度:'time_t'(又名'long')到'unsigned int')我猜这是告诉我,实质上我的种子不会改变,直到明年为了我的目的,使用时间作为我的种子将工作得很好,但我不知道如何摆脱这个警告.

我之前从未收到过该错误消息,因此我认为它与我的Mac有关.它是64位OS X v10.8.我也在使用Xcode编写和编译,但在其他使用Xcode的计算机上我没有遇到任何问题.

编辑:经过多次玩弄和研究后,我发现了64位Mac的错误.(如果我弄错了,请纠正我.)如果你试图让你的mac选择1到7之间的随机数time(NULL)作为种子,你将总是得到数字4.总是.我最终mach_absolute_time()用来播种我的随机数发生器.显然这消除了我程序中的所有可移植性......但我只是一个爱好者.

Edit2:源代码:

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, const char * argv[]) {

srand(time(NULL));

cout << rand() % 7 + 1;

return 0;
}
Run Code Online (Sandbox Code Playgroud)

我再次运行此代码来测试它.现在它只返回3.这必须与我的计算机有关,而不是C++本身.

c++ random

5
推荐指数
3
解决办法
5万
查看次数

我必须实例化这个类吗?或者这是一个错误的责任分离?

我正在练习课程,我创建了一个程序来创建一个矢量并计算它的大小.我将代码分开,以便一个类是一个矢量类,另一个类处理数学.我的问题是,这是不正确的?我必须实例化我的数学课才能够使用它,它看起来很笨,即使它有效.

主要:

int main()
{
    // Instantiate math library... ?
    Math math; // <-- Instantiating math library here
    Vector3D *test = new Vector3D("Test vector 1", 0, 0, 1);
    printVector(test);

    // Calling math library to calculate magnitude
    std::cout << "Test vector 1 magnitude: " << math.magnitude(test) << std::endl;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

矢量类:

class Vector3D {
    private:
        std::string     name;
        double          x;
        double          y;
        double          z;

    public:
        Vector3D();
        Vector3D(std::string, double, double, double);

        // Setters
        void setName(std::string);
        void setX(double);
        void setY(double);
        void setZ(double);

        // …
Run Code Online (Sandbox Code Playgroud)

c++ oop

3
推荐指数
2
解决办法
125
查看次数

if语句中无法识别滚动骰子编号

我有一个小程序,最后,该程序询问用户是否要掷骰子以赢得他们最初的支票额外15%的折扣,但是我的if语句无法识别出如果用户掷6,赢得折扣。当骰子最终掷出6时,它仍然读作失败,并告诉用户全额支付。我该如何解决?

我的课:

class roll
{
private:
    int high;
public:
    roll(int high = 6)
    {
        this->high = high;
    }

    ~roll()
    {

    }

    int rolled(int amt = 1)
    {
        int done = 0;

        for (size_t x = 0; x < amt; x++)
        {
            done += rand() % high + 1;
        }
        return done;
    }

};
Run Code Online (Sandbox Code Playgroud)

我的if语句:

  cout << "Would you like to play a dice game for a discount? Y/N: " << endl;
            cin >> res;
            if (res == 'Y' || res …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
2
解决办法
95
查看次数

我如何在没有重复的情况下随机迭代向量的每个元素

我尝试使用rand()with srand()生成随机索引号,但是我仍然得到重复的索引,是否还有其他方法可以遍历向量的所有元素?购买时可以随机获取索引而不影响向量元素random_shuffle()的顺序,因为随机混洗会改变向量的顺序顺序至关重要的元素。

c++ vector c++11

0
推荐指数
1
解决办法
63
查看次数

错误:隐式转换改变了符号:'int' 到 'unsigned long'

我正在使用 clang++ "file.cpp" -std=c++14 -Weverything -Wno-c++98-compat 来编译我的程序。现在我得到以下错误代码:

警告:隐式转换改变了符号:'int' 到 'unsigned long' [-Wsign-conversion]

错误行是这样的:

v_rand = rand() % (english.size());

整个错误代码:

void trainer_es (string lang)
{

    ifstream in("dictionary_es.txt");
    if(!in)
    {
        cout<<"ERROR"<<endl;
        }

    string line;
    int right=0;
    int wrong=0;
    vector<string> english, spanish;
    bool is_english = true; 
    while(in.eof()==0)  
        { 
            getline(in,line);
            if(is_english   
            {
                english.push_back(line);
            }
                else 
            {
            spanish.push_back(line);

            }
        is_english = !is_english;   
        }

    in.close();

    unsigned long v_rand;
    srand(unsigned (time(nullptr)));

    if (lang == "english")
    {
        for (unsigned long int i=0; i<deutsch.size()-1; i++)
        {

            v_rand = rand() …
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
1219
查看次数

双精度太高

经过大量操作后,我需要获取一个随机值。我看到,如果我写例如1000000并将其除以10为100倍,我应该得到一个几乎随机的数字。

double nump = 1000000000;
cout.precision(45);
for (int i = 1; i <= 100; i++) {
    nump = nump / 10;
}
cout << nump;
Run Code Online (Sandbox Code Playgroud)

但是,如果我启动此代码,每次都会得到相似的数字。哪里有机器不准确?为什么这么精确?如何进行这样的计算,会导致很大的误差?

c++

-2
推荐指数
1
解决办法
126
查看次数

标签 统计

c++ ×12

random ×6

c++11 ×4

oop ×1

restrict-qualifier ×1

vector ×1