ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-10 13:06:25  阅读:152  来源: 互联网

标签:random-seed c random


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

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

srand( time(nullptr) );

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

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

我考虑过使用类似的东西

srand( (int) this );

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

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

解决方法:

当且仅当您想要可重复的结果时,才使用随机数种子.这对于地图生成这样的事情来说非常方便,您希望地图随机化,但您希望它可以根据种子预测为随机.

对于大多数情况,你不需要它,你想要实际的随机数,最好的方法是通过标准库生成器函数:

#include <random>

std::random_device rd;
std::map<int, int> hist;
std::uniform_int_distribution<int> dist(0, 5);

int random_die_roll = dist(rd);

在这种情况下,不需要也不推荐种子. “随机设备”用于适当地播种PRNG(伪随机数发生器)以确保不可预测的结果.

同样,不要使用srand(time(NULL)),因为它是一个非常古老,非常糟糕的初始化随机数的方法,并且它是高度可预测的.在现代计算机上旋转一百万个可能的种子以找到匹配的输出是微不足道的.

标签:random-seed,c,random
来源: https://codeday.me/bug/20190910/1798649.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有