相关疑难解决方法(0)

如何在C++中生成随机数?

我正在尝试用骰子制作游戏,我需要在其中有随机数字(模拟模具的两侧.我知道如何在1到6之间进行).运用

#include <cstdlib> 
#include <ctime> 
#include <iostream>

using namespace std;

int main() 
{ 
    srand((unsigned)time(0)); 
    int i;
    i = (rand()%6)+1; 
    cout << i << "\n"; 
}
Run Code Online (Sandbox Code Playgroud)

效果不好,因为当我运行程序几次时,这是我得到的输出:

6
1
1
1
1
1
2
2
2
2
5
2
Run Code Online (Sandbox Code Playgroud)

所以我想要一个每次都会产生不同随机数的命令,而不是连续5次产生不同的随机数.有没有命令可以做到这一点?

c++ random

113
推荐指数
6
解决办法
37万
查看次数

为什么我使用mingw gcc4.8.1使用std :: random_device进行每次运行都会得到相同的序列?

我使用以下代码来测试c++ <random>库.

为什么每次运行已编译的可执行文件时都会得到完全相同的序列?rd()编译是确定性的吗?如何为每次运行获得不同的输出?

Windows 7 64位上的GCC 4.8.1.使用http://nuwen.net/mingw.html上的 MinGW发行版

编辑:我用Visual Studio测试了相同的代码.没有问题.输出是不确定的.这可能是我使用的mingw gcc 4.8.1中的一个错误.

#include <iostream>
#include <random>
using namespace std;
int main(){
 random_device rd;
 mt19937 mt(rd());
 uniform_int_distribution<int> dist(0,99);
 for (int i = 0; i< 16; ++i){
    cout<<dist(mt)<<" ";
 }
 cout <<endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ random stl c++11

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

建议初始化srand的方法?

我需要一种'好'的方法来初始化C++中的伪随机数生成器.我发现一篇文章指出:

为了生成类似随机数的数字,srand通常被初始化为一些独特的值,就像那些与执行时间相关的值.例如,函数时间返回的值(在标题ctime中声明)每秒都不同,这对于大多数随机需求来说足够独特.

Unixtime对我的应用来说并不是很有特色.有什么更好的方法来初始化它?奖励点是否可移植,但代码主要在Linux主机上运行.

我正在考虑做一些pid/unixtime数学来得到一个int,或者可能从中读取数据/dev/urandom.

谢谢!

编辑

是的,我实际上是每秒多次启动我的应用程序而且我遇到了碰撞.

c++ random srand

64
推荐指数
8
解决办法
9万
查看次数

如何找到std :: random_device的"真实"熵?

我想std::random_devicestd::random_device::entropy()函数检查我的实现是否具有非零熵(即非确定性).但是,根据cppreference.com

"这个函数在某些标准库中没有完全实现.例如,即使设备是非确定性的,gcc和clang也总是返回零.相比之下,Visual C++总是返回32,而boost.random返回10."

有没有办法找到真正的熵?特别是,现代计算机(MacBook Pro/iMac等)是否具有非确定性源或随机性,例如使用散热监视器?

c++ random c++11

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

C++ 11:如何使用<random>设置种子

我正在运用随机库,C++ 11的新手.我写了以下最小程序:

#include <iostream>
#include <random>
using namespace std;
int main() {
    default_random_engine eng;
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);
}
Run Code Online (Sandbox Code Playgroud)

当我反复运行它时,它每次都给出相同的输出:

>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
Run Code Online (Sandbox Code Playgroud)

我希望程序在每次调用时都设置不同的种子,这样每次都会生成一个不同的随机数.我知道随机提供了一个名为seed_seq的工具,但我发现它的解释(在cplusplus.com上)完全模糊不清:

http://www.cplusplus.com/reference/random/seed_seq/

我很感激有关如何让程序在每次调用时生成新种子的建议:越简单就越好.

我的平台:

random c++11

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

C++需要一个很好的技术来播种不使用time()的rand()

我有一个启动许多客户端进程的bash脚本.这些是人工智能游戏玩家,我用它来测试与许多玩家的游戏,大约有400个连接.

我遇到的问题是AI播放器使用的问题

srand( time(nullptr) );
Run Code Online (Sandbox Code Playgroud)

但是如果所有玩家大约在同一时间开始,他们将经常收到相同的time()值,这意味着他们都在同一个rand()序列中.

测试过程的一部分是确保如果大量客户端几乎同时尝试连接,服务器就可以处理它.

我考虑过使用类似的东西

srand( (int) this );
Run Code Online (Sandbox Code Playgroud)

或类似的,基于每个实例都有唯一内存地址的想法.

还有另一种更好的方法吗?

c++ random random-seed

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

将 std::random_device 与 pRNG(例如 std::mt19937)一起使用和不使用之间有什么区别?

在 C++11 中,可以使用std::random_device或不使用像 mt19937 这样的伪随机数生成器来生成数字。

在此示例代码中使用它会有什么区别:

#include <random>
#include <iostream>

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(1, 10);

    for (int i=0; i<16; ++i)
        std::cout << dist(rd) << "\t" << dist(mt) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

c++ random prng c++11

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

如何在汇编中播种随机数生成器?

我试图在汇编中创建一个完整的随机数,但每次启动程序时,它都会以相同的顺序给出相同的数字。如果数字是 12、132、4113 等,每次我启动代码时它都会重复它们。

我试图制作的程序有点像猜谜游戏。

    IDEAL
MODEL small
STACK 100h
DATASEG
;vars here
RNG_Seed dw ? 

CODESEG
; Generates a pseudo-random 15-bit number.
; Parameters: <none>
; Clobbers:   AX, DX
; Returns:    AX contains the random number
proc GenerateRandNum
   push bx
   push cx
   push si
   push di


   ; 32-bit multiplication in 16-bit mode (DX:AX * CX:BX == SI:DI)
   mov  ax, [RNG_Seed]
   xor  dx, dx
   mov  cx, 041C6h
   mov  bx, 04E6Dh
   xor  di, di
   push ax
   mul  bx
   mov  si, dx
   xchg …
Run Code Online (Sandbox Code Playgroud)

random x86 assembly x86-16

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

在 C++ 中从给定的种子生成相同的随机数序列

我正在使用 mt19937 从给定种子生成随机字符串,如下所示:

std::string StringUtils::randstring(size_t length, uint64_t seed) {
    static auto& chrs = "abcdefghijklmnopqrstuvwxyz";

    thread_local static std::mt19937 rg(seed);
    thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);

    std::string s;
    s.reserve(length);

    while(length--) {
        s += chrs[pick(rg)];
    }

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

我想保证随机数序列(以及生成的随机字符串)在同一架构的不同机器上是相同的,根据这个问题的答案应该是这样的。

但是,当我重建二进制文件(不更改任何依赖项或库)时,同一种子的随机数序列会发生变化(与使用相同种子的先前构建生成的序列相比)。

如何从同一机器架构+映像(x86_64 Linux)上不同二进制文件的给定种子生成有保证的随机数序列?

c++ random deterministic mersenne-twister

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

将 static thread_local 与 std::mt19937 一起使用有什么好处?

我见过std::mt19937以下几种用法:

#include <random>

size_t get_rand()
{
    static thread_local std::mt19937 generator(time(0));
    std::uniform_int_distribution<int> distribution(0, 10);
    return distribution(generator);
}
Run Code Online (Sandbox Code Playgroud)

我想知道使用static thread_local而不是static在这里能带来什么好处。// 第一个static是多余的

据我所知,在第二种情况下,generator线程的生命周期结束之前。是否有其他共同点或特殊情况的好处/差异?

c++ static thread-local mt19937

3
推荐指数
1
解决办法
729
查看次数