相关疑难解决方法(0)

C++中的int和long有什么区别?

如果我错了,纠正我,

int是4个字节,从-2,147,483,648到2,147,483,647(2 ^ 31)
长的值范围是4个字节,值范围从-2,147,483,648到2,147,483,647(2 ^ 31)

C++有什么区别?它们可以互换使用吗?

c++ variables

113
推荐指数
9
解决办法
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
查看次数

srand() - 为什么只调用一次?

这个问题是关于这个问题的评论 推荐的方法来初始化srand?第一条评论说srand()应该只在应用程序中调用ONCE.为什么会这样?

c random srand

71
推荐指数
4
解决办法
7万
查看次数

为什么我总是使用rand()得到相同的随机数序列?

这是我第一次用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 random

50
推荐指数
6
解决办法
11万
查看次数

第一个随机数总是小于休息

我碰巧注意到在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()输出似乎随时间线性变化.只是想知道原因.

c++ random qt

40
推荐指数
3
解决办法
2108
查看次数

srand(time(null))导致编译器警告:隐式转换失去整数精度

如果这个问题已经得到解答,请道歉.

#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问题,我需要解决?

我已经开始编程了所以我是一个完整的初学者.我的代码有问题还是我的编译器?

任何帮助,将不胜感激!

c++ compiler-warnings

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

如何使用gettimeofday()或与Visual Studio C++ 2008等效的东西?

有人可以帮我在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)

c visual-studio-2008 visual-studio visual-c++ gettimeofday

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

种子srand()的最佳方法是什么?

我学习的方法是初始播种随机数生成器,srand(time(NULL))然后使用调用rand()生成随机数.这种方法的问题是如果我在同一秒内多次运行我的程序,生成的随机数将始终相同.这有什么好办法?

c random srand

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

我可以在main中使用argc的地址作为随机源吗?

我想创建一个只需要一个随机数的程序,所以我尝试在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 random pointers program-entry-point argc

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

有比rand()更好的功能吗?

我有一个程序,在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)

提前致谢!

c random srand

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

如何为每个玩家生成不同的随机数?

两位玩家都获得相同的随机数!我希望每个玩家得到一个不同的数字,因为他们掷骰子.这是代码:

#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)

c random srand

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