平均随机数的封装类

简介: 平均随机数的封装类

核心代码从C++抄的。改进了两点:

a,种子初始化为time(null),此函数精确到秒。

b,构造函数可以指定随机数的最大值。比如:生成0到10的随机数。

c,范围从0x8ffff,扩充到0xFFFF。


class CRand
{
public:
  CRand(unsigned short uMax=0xFFFF)
  {
    m_seed = ::time(NULL);
    m_uMax = uMax ;
    for( int i = 1 ; i <= 16 ; i++ )
    {
      if( (1 << i) > uMax )
      {
        m_uMaxMask = ( 1 << i ) - 1 ;
        break;
      }
    } 
  }   
  int rand()
  {
    while(true)
    {
      m_seed = m_seed * 1103515245 + 12345;
      unsigned short r = (unsigned int)(m_seed >> 16)&m_uMaxMask ;
      if( r <= m_uMax )
      {
        return r ;
      }
    }
  }
  int m_seed;
protected:
  unsigned short m_uMaxMask;
  unsigned short m_uMax;
};

取[0,M]的随机数:直接rand()%(M+1)不是一个好主意,0到RAND_MAX是大致随机的,但%(M+1)就可能相差很大,比如:

假定M=RAND_MAX-1,那么rand()% (m+1) 后,0,RAND_MAX两个数是0,其它都只有一个数。所以0出现的几率是其它的两倍。

下面是测试代码:

const unsigned short iMax = 0x8000-2;
  CRand rand1,rand2(iMax);  
  int nums1[iMax+1]={0},nums2[iMax+1]={0};
  for( int j = 0 ; j < 0x2000 ; j++ )
  {
    rand1.m_seed = j ;
    rand2.m_seed = j ;
    for(int  i = 0 ; i < 0x10000 ; i++ )
    {   
      const int r1 = rand1.rand()%(iMax+1);
      ASSERT( ( r1 >= 0 ) && ( r1 <= iMax));
      nums1[r1]++;
      const int r2 = rand2.rand();
      ASSERT( ( r2 >= 0 ) && ( r2 <= iMax));
      nums2[r2]++;
    }
  }
  std::sort(nums1,nums1+iMax+1);
  std::sort(nums2,nums2+iMax+1);

结果见下图,方法二明显平均的多

image.png


相关文章
|
开发工具 git
git push报错:The current branch master has no upstream branch
git push报错:The current branch master has no upstream branch
40174 0
git push报错:The current branch master has no upstream branch
|
消息中间件 DataWorks 监控
如何从其他数据源同步数据到 ADS?
【8月更文挑战第10天】
293 2
|
JavaScript 前端开发 UED
小白请看! 大厂面试题 :如何用JS实现瀑布流
小白请看! 大厂面试题 :如何用JS实现瀑布流
|
机器人 数据中心
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
|
开发框架 运维 前端开发
构建一体化运维平台的八大功能
【6月更文挑战第6天】构建一体化运维平台的关键8个基本功能。
|
机器学习/深度学习 计算机视觉 网络架构
深度学习在图像识别中的应用与挑战
【5月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉进步的核心力量。特别是在图像识别领域,深度神经网络的引入极大地提高了系统的准确率和鲁棒性。本文旨在探讨深度学习技术在图像识别任务中的应用,分析其面临的主要挑战,并提出潜在的解决方案。我们将从卷积神经网络(CNN)的基本原理出发,进而讨论数据增强、迁移学习、模型压缩等关键技术,最后探讨计算资源限制、对抗性攻击以及模型泛化能力等挑战。
|
存储 运维 Kubernetes
带你读《云原生架构白皮书2022新版》——DevOps(下)
带你读《云原生架构白皮书2022新版》——DevOps(下)
385 69
|
消息中间件 存储 监控
消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ
常用的消息队列主要这 4 种,分别为 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ,主要介绍前三,不BB,上思维导图!
3438 0
消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ
|
关系型数据库 PostgreSQL 运维
PostgreSQL的时间/日期函数使用
PostgreSQL的常用时间函数使用整理如下: 一、获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ------------------------------- 2013-04-12 15:39:40.399711+08 (1 row) david=# current_timestamp 同 now() 函数等效。
1263 0
|
安全 网络协议 网络安全
什么是网闸?
什么是网闸?
2062 0