このブログを検索

2019年9月7日土曜日

【C++】 Fisher-Yates法

【C++】 Fisher-Yates法
(2019年9月7日)


■使用ソフト
・Visual Studio Community 2019


■言語
・C/C++


■Windows SDK バージョン
・10.0.17763.0
 ※Windows SDK バージョンの変更方法


■手順
1.以下をベースにコード変更する。
【C++】 メッセージボックスの作成

2.C++ファイル(.cpp)を以下のとおり変更する。
#include <windows.h>
#include <random>

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    WCHAR wcText[256];

    int size = 5;
    int randmin = 0;
    int randmax = 9;

    std::vector<int> v;
    v.reserve(randmax - randmin + 1);

    for (int i = randmin; i <= randmax; i++) v.push_back(i);//0, 1, 2, 3, 4, 5, 6, 7, 8, 9

    std::random_device seed;
    std::mt19937 random(seed());

    for (int i = 0; i < size; i++)
    {
        int x = std::uniform_int_distribution<int>(i, randmax - randmin)(random);

        if (i != x) std::swap(v[i], v[x]);
    }

    swprintf(wcText, 256, L"%d %d %d %d %d", v[0], v[1], v[2], v[3], v[4]);

    MessageBox(NULL, wcText, L"Fisher-Yates法", MB_OK);

    return 0;
}

3.実行結果(0~9までの数字をシャッフルして、最初の5文字を出力する)

4.参考文献
C++で効率よく重複のない乱数列を生成する

0 件のコメント:

コメントを投稿