我总是不确定,在C++中,restrict关键字是什么意思?
是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?
我似乎看到很多答案,有人建议使用它<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?
鉴于上述问题,一个很好的答案:
std::random_device或time(NULL)作为熵的来源.思考
我最近遇到了在C++ 11中生成随机数的新方法,但无法消化我读到的关于它的论文(什么是引擎,数学术语如分布,"所有生成的整数同样可能 ").
所以任何人都可以解释
您可以在一个有关随机数生成的常见问题解答中调用它.
我对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) 我一直在使用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) 我想知道使用rand()方法得到1-6范围的随机数的方法是什么.这是为了模拟我需要的骰子卷来找到3个骰子卷的平均值,因此类型将是双倍的.
我有两个问题.
还有什么其他方法可以在不使用C++的情况下为伪随机数生成器播种srand(time(NULL))?
我问第一个问题的原因.我目前正在使用时间作为发电机的种子,但发电机返回的数量始终相同.我很确定原因是因为存储时间的变量在某种程度上被截断了.(我有一条警告信息说,"隐式转换失去整数精度:'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++本身.
我正在练习课程,我创建了一个程序来创建一个矢量并计算它的大小.我将代码分开,以便一个类是一个矢量类,另一个类处理数学.我的问题是,这是不正确的?我必须实例化我的数学课才能够使用它,它看起来很笨,即使它有效.
主要:
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) 我有一个小程序,最后,该程序询问用户是否要掷骰子以赢得他们最初的支票额外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) 我尝试使用rand()with srand()生成随机索引号,但是我仍然得到重复的索引,是否还有其他方法可以遍历向量的所有元素?购买时可以随机获取索引而不影响向量元素random_shuffle()的顺序,因为随机混洗会改变向量的顺序顺序至关重要的元素。
我正在使用 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) 经过大量操作后,我需要获取一个随机值。我看到,如果我写例如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)
但是,如果我启动此代码,每次都会得到相似的数字。哪里有机器不准确?为什么这么精确?如何进行这样的计算,会导致很大的误差?