如果我错了,纠正我,
int是4个字节,从-2,147,483,648到2,147,483,647(2 ^ 31)
长的值范围是4个字节,值范围从-2,147,483,648到2,147,483,647(2 ^ 31)
C++有什么区别?它们可以互换使用吗?
我似乎看到很多答案,有人建议使用它<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)
作为熵的来源.思考
这个问题是关于这个问题的评论
推荐的方法来初始化srand?第一条评论说srand()
应该只在应用程序中调用ONCE.为什么会这样?
这是我第一次用C语言尝试随机数(我想念C#).这是我的代码:
int i, j = 0;
for(i = 0; i <= 10; i++) {
j = rand();
printf("j = %d\n", j);
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,每次运行代码时都会得到相同的序列.但是如果我srand(/*somevalue/*)
在for
循环之前添加,它会生成不同的随机序列.有谁能解释为什么?
我碰巧注意到在C++中,使用std rand()方法调用的第一个随机数大部分时间都明显小于第二个.关于Qt实现,第一个几乎总是小几个量级.
qsrand(QTime::currentTime().msec());
qDebug() << "qt1: " << qrand();
qDebug() << "qt2: " << qrand();
srand((unsigned int) time(0));
std::cout << "std1: " << rand() << std::endl;
std::cout << "std2: " << rand() << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出:
qt1: 7109361
qt2: 1375429742
std1: 871649082
std2: 1820164987
Run Code Online (Sandbox Code Playgroud)
这是因为播种错误还是错误?此外,当qrand()输出强烈变化时,第一个rand()输出似乎随时间线性变化.只是想知道原因.
如果这个问题已经得到解答,请道歉.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand( time(NULL) );
cout << rand();
}
Run Code Online (Sandbox Code Playgroud)
"隐式转换失去整数精度:'time_t'(又名'long')到'unsigned int'"
我执行上面的代码时得到的错误消息.我正在使用xcode 4.6.1.现在,当我使用不同的编译器,例如来自codepad.org的编译器时,它执行完全正常生成看起来像随机数,所以我假设它是一个xcode问题,我需要解决?
我已经开始编程了所以我是一个完整的初学者.我的代码有问题还是我的编译器?
任何帮助,将不胜感激!
有人可以帮我在Windows XP上使用Visual Studio C++ 2008的gettimeofday()函数吗?这是我在网上找到的代码:
#include < time.h >
#include <windows.h>
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag;
if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
/*converting file time to …
Run Code Online (Sandbox Code Playgroud) 我学习的方法是初始播种随机数生成器,srand(time(NULL))
然后使用调用rand()
生成随机数.这种方法的问题是如果我在同一秒内多次运行我的程序,生成的随机数将始终相同.这有什么好办法?
我想创建一个只需要一个随机数的程序,所以我尝试在main函数中使用argc的地址作为随机源,因为我认为程序在内存中的位置是随机的,也可以保存一些include语句,所以我试过了:
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我发现每次输出都不是很"随机":它们是4的倍数:
17591828907268
17591841542404
17591845040388
17591834556676
Run Code Online (Sandbox Code Playgroud)
是什么原因?并且使用argc的地址作为随机数可能吗?
然后我尝试删除一些地址:
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv >> 12);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这次看起来很随机,至少它有奇数和偶数:
34359070631
34359034616
34359078055
34359080624
Run Code Online (Sandbox Code Playgroud)
将argc的地址变成随机数的"正确"方法是什么?
我有一个程序,在C中,它使用0-999的随机数创建一个1000个整数的数组,然后在该数组上执行某种算法.为了测试算法的运行时间,我尝试运行程序10000次,但每次运行它时,数组对于一些数组是相同的,然后它会改变.我已经使用该srand()
函数以当前时间提供种子,但它仍然无济于事.
是否有替代解决方案rand()
或解决方法?我的功能是:
void getarray(int *ptr1, int size, int option){
int n;
srand(time(NULL));
for(n=0; n<size; n++)
*(ptr1+n) = *(ptr2+n)= rand()%1000;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
两位玩家都获得相同的随机数!我希望每个玩家得到一个不同的数字,因为他们掷骰子.这是代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int roll_a_dice(void);
int main(int argc, const char *argv[])
{
int flag;
int answer1 = roll_a_dice();
int answer2 = roll_a_dice();
printf("Die 1 (rolled by player 1): %d\n", answer1);
printf("Die 2 (rolled by player 2): %d\n", answer2);
if (answer1>answer2) {
printf("Player 1 is starting!\n");
flag = 1;
} else {
printf("Player 2 is starting!\n");
flag = 2;
}
printf("Goodbye!\n");
return 0;
}
int roll_a_dice(void)
{
int r;
srand(time(NULL));
r = 1 + rand() % 6; …
Run Code Online (Sandbox Code Playgroud)