得到任意随机整数的简单办法 大家来看看

gemo 2009-06-03 10:47:29
要得到一个0~0x7fff之内的随机数 我们可以

UINT GetRandom()
{
return rand();
}


要得到一个n~0x7fff之内的随机数 我们可以

UINT GetRandom(UINT uMin, UINT uMax)
{
return rand()%(++uMax-uMin)+uMin;
}


但是如何得到更大的随机数呢 0~0x7fff可以映射到小于自身的范围上 但是无法映射到大于自身的范围上
于是我设想如下方法 先得到一个0~0xffffffff内的数 然后将其映射到指定的范围上

UINT GetRandom(UINT uMin, UINT uMax)
{
assert(uMin <= uMax);
assert(uMax < INT_MAX*2+1); // uMax < 0xffffffff

UINT n = 0;
for (int i = 0; i < 8; i++)
{
int j = rand()%16;
n += (j<<(4*i));
}

return n%(++uMax-uMin)+uMin;
}


这种方法效果如何 是否有改进的余地 请各位高手指点
...全文
124 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gunsand 2009-08-03
  • 打赏
  • 举报
回复
用RAND 种子。随便了
minger909 2009-08-03
  • 打赏
  • 举报
回复
假随机 请用系统时间做为随机种子
taodm 2009-08-03
  • 打赏
  • 举报
回复
要看什么呢?
大家在要求不高的场合都这么干的。
gemo 2009-08-03
  • 打赏
  • 举报
回复
没人看
  • 打赏
  • 举报
回复
srand初始化一次,然后rand求余。

其他的你怎么改进都是伪随机。
gemo 2009-06-03
  • 打赏
  • 举报
回复
之所以没有把srand(time(0))这句放在随机函数里的原因是:
如果反复调用GetRandom() 则随机种子会被反复设置为当期时间 由于函数执行极快 造成多次使用同一种子
所以我一般把srand(time(0))放在线程入口处
tangshuiling 2009-06-03
  • 打赏
  • 举报
回复

一种自我欺骗的方法,感觉不错!
不过rand()没有随机种子的话,出来的随机数就不那么随机啦。

64,686

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧