zoukankan      html  css  js  c++  java
  • c++ 随机

    Singleton.h

     1 #pragma once
     2 #include <cassert>
     3 
     4 
     5 template <class T>
     6 class Singleton
     7 {
     8 public:
     9     Singleton()
    10     {
    11         assert(!ms_pSingleton);
    12         ms_pSingleton = static_cast<T*>(this);
    13     }
    14 
    15     ~Singleton()
    16     {
    17         assert(ms_pSingleton);
    18         ms_pSingleton = nullptr;
    19     }
    20 
    21     static T* Instance()
    22     {
    23         return ms_pSingleton;
    24     }
    25 
    26 private:
    27     Singleton(const Singleton<T> &) = delete;
    28     Singleton& operator = (const Singleton<T> &) = delete;
    29 protected:
    30     static T *ms_pSingleton;
    31 };
    32 
    33 template <class T>
    34 T *Singleton<T>::ms_pSingleton = nullptr;

    Random.h

     1 #pragma once
     2 #include <random>
     3 #include <map>
     4 
     5 #include "Singleton.h"
     6 
     7 struct RandomCreater
     8 {
     9     long randomSeed();
    10     void init();
    11     int random(int begin, int end);
    12 
    13     std::mt19937 *mt = nullptr;
    14     int useCount = 0;
    15     long seed = 0;
    16 };
    17 
    18 
    19 class Random : public Singleton<Random>
    20 {
    21 public:
    22     Random();
    23     ~Random();
    24     int random(int begin, int end, std::string createName = "");
    25 private:
    26     std::map<std::string, std::shared_ptr<RandomCreater>> m_allRandomCreater;
    27     std::shared_ptr<RandomCreater> m_defaultCreater;
    28 };

    Random.cpp

     1 #include "Random.h"
     2 
     3 long RandomCreater::randomSeed()
     4 {
     5     std::random_device rd;
     6     return rd();
     7 }
     8 
     9 void RandomCreater::init()
    10 {
    11     if (seed == 0 || useCount > 1000)
    12     {
    13         seed = randomSeed();
    14         useCount = 0;
    15         if (mt != nullptr)
    16             delete mt;
    17 
    18         mt = new std::mt19937(seed);
    19     }
    20 }
    21 
    22 int RandomCreater::random(int begin, int end)
    23 {
    24     if (begin == end) return begin;
    25 
    26     int min = begin < end ? begin : end;
    27     int max = begin < end ? end : begin;
    28 
    29     int rt = (*mt)() % (abs(max - min));
    30     rt = rt + min;
    31 
    32     return rt;
    33 }
    34 
    35 
    36 Random::Random()
    37 {
    38     m_defaultCreater = std::make_shared<RandomCreater>();
    39     m_defaultCreater->init();
    40 }
    41 
    42 Random::~Random()
    43 {
    44 }
    45 
    46 int Random::random(int begin, int end, std::string createName)
    47 {
    48     std::shared_ptr<RandomCreater> useCreater = m_defaultCreater;
    49     if (!createName.empty())
    50     {
    51         if (m_allRandomCreater.find(createName) == m_allRandomCreater.end())
    52         {
    53             m_allRandomCreater[createName] = std::make_shared<RandomCreater>();
    54         }
    55 
    56         useCreater = m_allRandomCreater[createName];
    57     }
    58     useCreater->init();
    59     useCreater->useCount++;
    60     return useCreater->random(begin, end);
    61 }

    main.cpp

     1 #include <iostream>
     2 #include "Random.h"
     3 
     4 int main(int argc, char* argv[])
     5 {
     6     new Random();
     7     std::cout << Random::Instance()->random(-100, 100);
     8 
     9     getchar();
    10 
    11     return 0;
    12 }
  • 相关阅读:
    OCP-1Z0-053-V13.02-252题
    Java中list.get(index)报错
    OCP-1Z0-053-V13.02-103题
    Hash unique和Sort unique
    如何解决mysql数据库8小时无连接自动关闭
    OCP-1Z0-053-V13.02-538题
    OCP-1Z0-053-V13.02-537题
    OCP-1Z0-053-V13.02-518题
    用绘本回忆青春创业经历——leo鉴书46
    OCP-1Z0-053-V13.02-502题
  • 原文地址:https://www.cnblogs.com/weishuan/p/10533233.html
Copyright © 2011-2022 走看看