我正在尝试用骰子制作游戏,我需要在其中有随机数字(模拟模具的两侧.我知道如何在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>库.
为什么每次运行已编译的可执行文件时都会得到完全相同的序列?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++中的伪随机数生成器.我发现一篇文章指出:
为了生成类似随机数的数字,srand通常被初始化为一些独特的值,就像那些与执行时间相关的值.例如,函数时间返回的值(在标题ctime中声明)每秒都不同,这对于大多数随机需求来说足够独特.
Unixtime对我的应用来说并不是很有特色.有什么更好的方法来初始化它?奖励点是否可移植,但代码主要在Linux主机上运行.
我正在考虑做一些pid/unixtime数学来得到一个int,或者可能从中读取数据/dev/urandom.
谢谢!
编辑
是的,我实际上是每秒多次启动我的应用程序而且我遇到了碰撞.
我想std::random_device
用std::random_device::entropy()函数检查我的实现是否具有非零熵(即非确定性).但是,根据cppreference.com
"这个函数在某些标准库中没有完全实现.例如,即使设备是非确定性的,gcc和clang也总是返回零.相比之下,Visual C++总是返回32,而boost.random返回10."
有没有办法找到真正的熵?特别是,现代计算机(MacBook Pro/iMac等)是否具有非确定性源或随机性,例如使用散热监视器?
我正在运用随机库,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/
我很感激有关如何让程序在每次调用时生成新种子的建议:越简单就越好.
我的平台:
我有一个启动许多客户端进程的bash脚本.这些是人工智能游戏玩家,我用它来测试与许多玩家的游戏,大约有400个连接.
我遇到的问题是AI播放器使用的问题
srand( time(nullptr) );
Run Code Online (Sandbox Code Playgroud)
但是如果所有玩家大约在同一时间开始,他们将经常收到相同的time()值,这意味着他们都在同一个rand()序列中.
测试过程的一部分是确保如果大量客户端几乎同时尝试连接,服务器就可以处理它.
我考虑过使用类似的东西
srand( (int) this );
Run Code Online (Sandbox Code Playgroud)
或类似的,基于每个实例都有唯一内存地址的想法.
还有另一种更好的方法吗?
在 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) 我试图在汇编中创建一个完整的随机数,但每次启动程序时,它都会以相同的顺序给出相同的数字。如果数字是 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) 我正在使用 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)上不同二进制文件的给定种子生成有保证的随机数序列?
我见过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线程的生命周期结束之前。是否有其他共同点或特殊情况的好处/差异?