青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
// RandomTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <cmath>
#include <random>
#include <cstdint>
#include <ctime>
#include <algorithm>
#include <numeric>
#include <cassert>
#include <climits>
#include <thread>

#define XASSERT(exp) assert(exp)
#define XASSERT_MSG(exp, msg) assert(exp)
#define X_DEFAULT_FLOAT_PRECISION (0.00000001)

// @in: 總次數、目標比例(千分比)、算法類型(1.c標準庫rand; 2.cpp11 mt19937)
// @out: 實際命中次數、實際命中概率
bool RandomHitTest(int32_t nTotalCount, float fHitRate, int32_t nAlgorithmType, int32_t& nRealHitCount, float& fRealHitRate);
void RandomHitTest_std_mt19937(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate);
void RandomHitTest_std_rand(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate);
// 簡化std::rand獲取[nMin, nMax]區間的一個數字
uint32_t StdRandEx(uint32_t nMin, uint32_t nMax);


int _tmain(int argc, _TCHAR* argv[])
{
    //std::thread srandThread([](){ std::this_thread::sleep_for(std::chrono::seconds(1));});
    
//srandThread.detach();

    std::vector<std::tuple<floatfloat>> vecResult;

    for (int n = 0; n < 1000; n++)
    {
        uint32_t nTotalCount = 100000;  // 基數100000次

        for (float fHitRate = 0.001f; 1.f - fHitRate >= 0; fHitRate = fHitRate + 0.101f)
        {
            int32_t nRealHitCount = 0;
            float fRealHitRate = 0;

            // std::rand測試
            RandomHitTest(nTotalCount, fHitRate, 1, nRealHitCount, fRealHitRate);
            //std::cout << "AlgorithmType=" << 1 << ",TotlaCount=" << nTotalCount << ",HitRate=" << 
            
//    fHitRate  << ",ReahHitRate=" << std::fixed << fRealHitRate << ",RealHitCount=" << nRealHitCount << std::endl;


            int32_t nRealHitCount1 = 0;
            float fRealHitRate1 = 0;

            // cpp11 mt19937
            RandomHitTest(nTotalCount, fHitRate, 2, nRealHitCount1, fRealHitRate1);
            //std::cout << "AlgorithmType=" << 2 << ",TotlaCount=" << nTotalCount << ",HitRate=" << 
            
//    fHitRate  << ",ReahHitRate=" << std::fixed << fRealHitRate1 << ",RealHitCount=" << nRealHitCount1 << std::endl;
            
//std::cout << "---differ rate=" << std::fixed << fRealHitRate1 - fRealHitRate << ", differ count=" 
            
//    << nRealHitCount1 - nRealHitCount << std::endl;

            std::tuple<floatfloat> tupleResult = std::make_tuple(fHitRate, std::fabsf(fRealHitRate1 - fRealHitRate));
            vecResult.push_back(tupleResult);
        }
    }

    std::sort(vecResult.begin(), vecResult.end(), 
        [](std::tuple<floatfloat>& tupLeft, std::tuple<floatfloat>& tupRight)->bool{
            //float fHitRateL = 0;
            
//float fRealRateL = 0;

            
//float fHitRateR = 0;
            
//float fRealRateR = 0;
            return std::get<1>(tupLeft) - std::get<1>(tupRight) > 0;;
    });

    auto tupleFirst = vecResult[0];

    return 0;
}


uint32_t StdRandEx(uint32_t nMin, uint32_t nMax)
{
    XASSERT((nMin >= 0) && (nMax >= 0) && (nMin <= nMax));

    uint32_t nRandVal = 0;

    if (nMin == nMax)
    {
        nRandVal = nMax;
    }
    else if (nMin < nMax)
    {
        nRandVal = rand() % (nMax - nMin + 1) + nMin;
    }
    else
    {
        XASSERT_MSG(0, _T("參數異常"));
    }

    return nRandVal;
}

void RandomHitTest_std_rand(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate)
{
    nRealHitCount = 0;
    fRealHitRate = 0;

    if (nTotalCount <= 0 || fHitRate <= 0)
    {
        return;
    }

    // 計算浮點小數點個數
    int32_t nWeCount = 3;  // 位數(三位數,千分比精度)
    XASSERT((fHitRate * std::pow(10, nWeCount)) - std::numeric_limits<uint64_t>::max() <= X_DEFAULT_FLOAT_PRECISION);  // 永不溢出
    int64_t nHitRateIntHelp = static_cast<uint64_t>(fHitRate * std::pow(10, nWeCount));  // 概率轉整數輔助計算

    
// 根據位數決定隨機數范圍
    int32_t nRandMin = 0;
    int32_t nRandMax = std::pow(10, nWeCount);

    // 開始測試
    auto nTestCount = nTotalCount;
    while (nTestCount-- > 0)
    {
        // 生成隨機數
        int32_t nRandVal = StdRandEx(nRandMin, nRandMax);

        // 命中判定
        if (nRandVal < nHitRateIntHelp)
        {
            nRealHitCount++;
        }
    }

    fRealHitRate = float(nRealHitCount)/float(nTotalCount);
}

void RandomHitTest_std_mt19937(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate)
{
    nRealHitCount = 0;
    fRealHitRate = 0;

    if (nTotalCount <= 0 || fHitRate <= 0)
    {
        return;
    }

    // 計算浮點小數點個數
    int32_t nWeCount = 3;  // 位數(三位數,千分比精度)
    XASSERT((fHitRate * std::pow(10, nWeCount)) - std::numeric_limits<uint64_t>::max() <= X_DEFAULT_FLOAT_PRECISION);  // 永不溢出
    int64_t nHitRateIntHelp = static_cast<uint64_t>(fHitRate * std::pow(10, nWeCount));  // 概率轉整數輔助計算

    
// 根據位數決定隨機數范圍
    int32_t nRandMin = 0;
    int32_t nRandMax = std::pow(10, nWeCount);

    // 設置隨機數生成器
    std::random_device rd;
    std::mt19937_64 gen(rd());
    std::uniform_int_distribution<> dis(nRandMin, nRandMax);
    
    // 重設種子應該使用這個api:::CryptGenRandom
    
// linux也有相應的高精度隨機數
    gen.seed(uint32_t(time(NULL)));

    // 開始命中測試
    auto nTestCount = nTotalCount;
    while (nTestCount-- > 0)
    {
        // 生成隨機數
        uint32_t randVal = dis(gen);

        if (randVal < nHitRateIntHelp)
        {
            nRealHitCount++;
        }
    }

    fRealHitRate = float(nRealHitCount)/float(nTotalCount);
}


bool RandomHitTest(int32_t nTotalCount, float fHitRate, int32_t nAlgorithmType, int32_t& nRealHitCount, float& fRealHitRate)
{
    if (nTotalCount <= 0)
    {
        return false;
    }

    bool bRet = true;
    switch (nAlgorithmType)
    {
    case 1:
        RandomHitTest_std_rand(nTotalCount, fHitRate, nRealHitCount, fRealHitRate);
        break;
    case 2:
        RandomHitTest_std_mt19937(nTotalCount, fHitRate, nRealHitCount, fRealHitRate);
        break;
    default:
        bRet = false;
        break;
    }

    return true;
}

posted on 2017-01-22 12:28 Enic 閱讀(1344) 評論(0)  編輯 收藏 引用 所屬分類: 從零開始寫棋牌游戲平臺
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久中精品2020中文| 国产一区二区激情| 亚洲视频在线观看免费| 亚洲免费福利视频| 亚洲美女毛片| 在线视频精品一区| 亚洲综合久久久久| 欧美自拍偷拍午夜视频| 麻豆精品视频在线| 欧美日韩一区二区欧美激情| 国产精品久久久久三级| 国产农村妇女毛片精品久久麻豆 | 快播亚洲色图| 欧美另类变人与禽xxxxx| 国产精品电影网站| 国产视频一区在线观看一区免费| 黄色在线成人| 亚洲手机成人高清视频| 久久人体大胆视频| 亚洲日本中文字幕| 亚洲综合精品自拍| 欧美国产极速在线| 国产小视频国产精品| 91久久久久久国产精品| 亚洲免费视频观看| 亚洲高清不卡av| 国产精品嫩草影院一区二区| 久久大逼视频| 欧美精品999| 国产亚洲一区二区在线观看| 亚洲精品欧美一区二区三区| 欧美一区二区三区婷婷月色| 亚洲福利国产| 欧美一区二区高清| 欧美午夜久久久| 亚洲精品免费一二三区| 久久久久久久综合| 99天天综合性| 欧美高清视频一二三区| 韩日精品在线| 欧美一区激情视频在线观看| 亚洲美女av在线播放| 另类成人小视频在线| 国产精品一区二区久久精品| 99精品国产热久久91蜜凸| 另类激情亚洲| 欧美在线亚洲一区| 国产一区二区久久| 欧美在线一二三四区| 日韩一级黄色大片| 欧美另类一区| 亚洲精品免费在线播放| 欧美风情在线观看| 久久综合精品国产一区二区三区| 国产精品自拍在线| 欧美一级视频| 午夜精品久久久久久久久| 国产精品免费久久久久久| 亚洲影视在线播放| 亚洲图片在区色| 国产精品午夜国产小视频| 亚洲一区二区三区成人在线视频精品| 亚洲高清视频的网址| 欧美插天视频在线播放| 亚洲欧洲一区二区在线观看| 欧美激情视频网站| 欧美激情影院| 亚洲免费网址| 午夜日本精品| 韩日成人av| 欧美激情第10页| 欧美日本高清视频| 午夜视黄欧洲亚洲| 久久精品中文字幕一区| 亚洲国产精品久久久| 亚洲经典一区| 国产精品护士白丝一区av| 香蕉乱码成人久久天堂爱免费| 亚洲欧美国产日韩天堂区| 国内精品美女在线观看| 欧美黑人国产人伦爽爽爽| 欧美日韩国产成人在线| 午夜精品免费| 久久夜色撩人精品| 99国产精品久久久久久久久久| 99精品国产在热久久下载| 国产亚洲日本欧美韩国| 久久gogo国模裸体人体| 亚洲黄色免费| 中文av字幕一区| 黄页网站一区| 日韩午夜黄色| 国内偷自视频区视频综合| 亚洲国产成人久久| 国产日韩一区二区三区| 亚洲大片在线观看| 国产美女精品视频免费观看| 欧美成人精品不卡视频在线观看| 欧美日产在线观看| 久久一日本道色综合久久| 欧美三级午夜理伦三级中文幕 | 欧美高清在线| 国产精品国产三级国产普通话99 | 另类尿喷潮videofree| 欧美激情性爽国产精品17p| 欧美一区二区在线| 欧美人与禽性xxxxx杂性| 毛片基地黄久久久久久天堂| 国产精品久久久久久久久久久久久久| 久久人人爽人人| 国产精品人人做人人爽| 亚洲人成在线观看网站高清| 国内精品久久久久久影视8| 99精品视频一区| 亚洲精品欧美精品| 久久一二三国产| 久久精品99国产精品日本| 欧美日韩视频在线第一区| 欧美国产一区二区| 狠狠色狠色综合曰曰| 亚洲欧美日韩国产中文| 亚洲一区在线免费| 欧美日韩精品一二三区| 亚洲高清精品中出| 亚洲国产日韩一区| 久久综合图片| 欧美成人第一页| 狠狠色丁香久久婷婷综合_中| 亚洲欧美日韩第一区| 亚洲欧美一区二区在线观看| 欧美日韩一区二区三区在线看 | 亚洲激情图片小说视频| 亚洲高清视频一区二区| 久久嫩草精品久久久久| 美女日韩欧美| 亚洲国产精品黑人久久久| 久久综合狠狠综合久久综青草| 久久人人看视频| 精品91在线| 欧美bbbxxxxx| 亚洲国产视频一区| 日韩一级大片在线| 欧美日韩免费| 亚洲男人的天堂在线aⅴ视频| 亚洲女人天堂成人av在线| 国产精品视频yy9299一区| 一本色道久久综合一区| 鲁大师影院一区二区三区| 久久国产日本精品| 国产亚洲a∨片在线观看| 欧美一区二区视频在线| 久久久精品性| 亚洲娇小video精品| 欧美精品一区二区三区久久久竹菊 | 99riav国产精品| 欧美午夜电影一区| 亚洲欧美日韩在线观看a三区| 久久久精彩视频| 影音先锋亚洲精品| 欧美成人国产| 正在播放欧美视频| 久久久亚洲国产天美传媒修理工| 依依成人综合视频| 欧美日本三级| 性欧美在线看片a免费观看| 久久综合电影| 在线视频欧美精品| 国产综合自拍| 欧美日韩国产一区二区三区地区 | 欧美a级一区| 亚洲免费一级电影| 欧美福利在线| 欧美一区二区三区视频| 亚洲国产日韩欧美综合久久| 欧美日韩在线播放三区| 久久丁香综合五月国产三级网站| 亚洲国产精品女人久久久| 欧美在线播放高清精品| 亚洲国产日韩欧美在线图片| 国产精品看片你懂得| 免费成人激情视频| 香蕉久久国产| 在线亚洲美日韩| 亚洲韩日在线| 麻豆精品在线观看| 久久aⅴ国产紧身牛仔裤| 日韩亚洲欧美综合| 伊人久久噜噜噜躁狠狠躁| 国产精品久久99| 欧美区在线观看| 久久综合亚州| 午夜精品一区二区三区在线播放| 亚洲精品久久久久| 欧美sm视频| 久久亚洲午夜电影| 久久精品欧美| 久久经典综合| 久久久精品2019中文字幕神马| 亚洲女同性videos| 在线视频欧美日韩|