简单谈谈关于C++中大随机数的问题

2020-01-06 16:24:01王旭


int bigRand(int min, int max) 
{ 
 if (min > max) 
 { 
 min = max; 
 } 
 
 int rand1 = rand() % 10000; 
 int rand2 = rand() % 10000; 
 int randV = (rand1 * 10000 + rand2) % (max - min + 1);//改成这样 
 
 int randResult = min + randV; 
 return randResult; 
} 

10000以下和10000以上完全不相干,两次随机不相干。只有这样才能使正确的随机。

其实就是求模的时候,模式多少,第一次随机就要乘以多少。rand1乘以的是rand2的模。

百度了一下其他人的随机数。


#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
unsigned long ulrand(void) { 
 return ( 
 (((unsigned long)rand()<<24)&0xFF000000ul) 
 |(((unsigned long)rand()<<12)&0x00FFF000ul) 
 |(((unsigned long)rand() )&0x00000FFFul)); 
} 
int i; 
unsigned long ul; 
void main() { 
 srand(time(NULL)); 
 for (i=0;i<10;i++) { 
 ul=ulrand(); 
 printf("%010lu 0x%08xn",ul,ul); 
 } 
} 

还有这个简单点的:


int BigRand() 
{ 
 return RAND_MAX*rand() + rand(); 
} 

其实都是通过移位的方式,移出那个随机数的最大值就行。

不过有个问题要考虑的,就是跨平台问题。不同平台的整形的长度可能不同,RAND_MAX也可能不同。总是移位,可能会出现数组越界。

所以为了安全起见还是用我写的两个10000最大值的随机数吧。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


注:相关教程知识阅读请移步到C++教程频道。