JSは賞金の重さに基づいて当選確率を計算します

JSは賞金の重さに基づいて当選確率を計算します

1. シナリオ例

1.1. 抽選の賞品名を設定する

賞名: [「最優秀賞」、「第2位」、「第3位」、「受賞なし」]。懸賞イベントではこれら 4 つの賞品が設定されていますが、もちろん開発者はそれをさらに拡張することもできます。

var Prizes = ["一等賞","二等賞","三等賞","無賞"]; // 賞名の配列

1.2. 各賞の重みを設定する

賞金の重み: [1、5、20、74]。賞金の重みは、主に各賞品の当選確率を表すために使用されます。ここで、賞金の重み配列の合計は 100 (=1+5+20+74) であり、1 は 1 等賞品の当選確率が 1% であること、5 は 1 等賞品の当選確率が 5% であること、20 は 3 等賞品の当選確率が 20% であること、残りの 74 は当選しない確率が 74% であることを意味します。

var PrizeWeight = [1, 5, 20, 74]; // 賞金の重み配列。合計で各賞品を獲得する確率のパーセンテージを表します。例えば、一等賞の当選率は1%、二等賞の当選率は5%です。

宝くじにさらに賞品が設定されている場合、開発者は重み配列の合計をそれに応じて拡張することもできます。たとえば、重みの合計は 500、1000 などになり、それに応じて配列要素を設定して、500 回の抽選ごとに何回、どのレベルの賞品を獲得できるかを表すことができます。

さらに、開発者は賞の名前と賞の重みの配列を 1 つのオブジェクトで一緒に宣言することもできます。

//賞の名前、重量などを設定します。array var Prizes = [
    {"name": "一等賞", "weight": 1}, 
    {"name": "2等賞", "weight": 5}, 
    {"name": "3位", "weight": 20}, 
    {"name": "勝てない", "weight": 74}
];

1.3. ラッキードローのルール

  • 0 < この宝くじの乱数 <= 1 の場合、一等賞が当選したことを示します。
  • 1 < この宝くじの乱数 <= 5 の場合、2 等賞に当選します。
  • 5 < この宝くじの乱数 <= 20 の場合、3等賞に当選します。
  • この抽選の乱数は 20 より大きいため、当選者はいません。

2. 実施原則

この記事は単純な実装であるため、この宝くじプログラムの原理も比較的単純になるように設計されています。

  • 重み配列の合計 (weightSum) に応じて、各抽選で重み乱数 (weightRandom) が生成されます。この重み乱数 (weightRandom) は、0 から weightSum (重み合計値) までの範囲です。この例で設定されている重み配列の合計値は 100 です。つまり、生成された重み乱数は 0 から 100 までの範囲になります。
  • 次に、この加重乱数 (weightRandom) を重み配列内のすべての要素値と比較し、この加重乱数 (weightRandom) がどの 2 つの賞品の間にあるか、どの当選ルールを満たしているか、どの賞品名に対応しているかを計算します。

例えば、ある宝くじで生成された加重乱数(weightRandom)は15.15です。1.3の活動ルールによれば、5 <15.15<= 20なので、今回生成された加重乱数(weightRandom)は3等賞を獲得できることを意味します。

これらを別々に実装してみましょう。

2.1. 重みと値を計算する

//配列の累積合計関数: Array.reduce(function(prev ,cuurentValue), initialValue)
var weightSum = PrizeWeight.reduce(function(prev, currVal){ // 重量の合計を計算します: 1+5+20+74=100
    return prev + currVal; //prev は前回の累積後の値、currVal は今回追加される値です}, 0);

2.2. 抽選関数を書く

重みと値weightSumに基づいて、0からweightSumの間のランダムな重み値を生成します。

//抽選関数 var lottery = function(weightSum) {
    var res = "当選なし"; // 抽選結果のデフォルト設定は "当選なし" です
    console.log("このプログラムの賞の重みと価値:", weightSum);
    
    // 0 から weightSum までのランダムな重みの数値を生成しますvar random = Math.random()*weightSum; // ランダムな重みの数値を生成します (0 から weightSum まで)
    console.log("この抽選のランダムな重み:", random);
    
    // 重み配列を再構成して並べ替えます var concatWeightArr = PrizeWeight.concat(random); // 重み配列にランダムな数値を追加します var sortedWeightArr = concatWeightArr.sort(function(a, b){return ab;}); // ランダムな数値を含む新しい重み配列を小さい順 (昇順) に並べ替えます console.log("ランダムな数値を含む新しい重み配列は昇順で並べ替えられています:", sortedWeightArr);
    
    // 重み付けされた乱数の配列インデックス var randomIndex = sortedWeightArr.indexOf(random); // 新しい重み配列内のインデックス付き乱数の位置 randomIndex = Math.min(randomIndex, Prizes.length -1); // 重み付けされた乱数のインデックスは賞品配列の長さ - 1 を超えてはなりません。賞品配列内の乱数のインデックス位置を再計算します console.log("この重み付けされた乱数に対応する配列インデックス:", randomIndex);
    
    //対応する賞品を取得します res = Prizes[randomIndex]; //賞品配列からこの抽選の結果を取得します console.log("この抽選の結果:", res);
    
    return {"weightSum": weightSum , "weightRandom": random, PrizeIndex: randomIndex, "data": res}; //この抽選の結果を返します};

以下の点に注意してください。

(1)抽選機能では、まずランダムな重量番号(ランダム)を生成し、次にこのランダムな重量番号(ランダム)を元の重量配列とマージし(Array.concat()関数を使用、戻り値は新しい配列で、元の重量配列は変更されません)、新しい重量配列を生成し、新しい重量配列を小さいものから大きいもの(昇順)にソートします(Array.sort()関数を使用)。このようにして、ランダムな重量番号(ランダム)は、大きさの順に2つの賞品重量値の間に収まります。最後に、新しい重み配列内のランダムな重み番号 (random) をインデックスすることで、賞名配列内の対応する要素を取得できます。

(2)例えば、抽選関数によって生成されたランダムな重みの数字は15.15です。これを元の重み配列[1, 5, 20, 74]と結合してソートすると、新しい重み配列[1, 5, 15.15, 20, 74]が得られます。ランダムな重みの数字(15.15)は5から20の間にあります。新しい重み配列におけるランダムな重みの数字(15.15)の添え字は2です。添え字2の賞品名配列の対応する要素が取り出されます:prizes[2] = "third Prize"。このことから、今回の宝くじでは3等賞が当たる可能性があると判断できます。

(3)抽選機能では、重み付き乱数(ランダム)の大きさがどの賞品に対応するかを判断するため、つまり重み付き乱数の大きさと重み配列の各要素の値を比較するために、エディターは従来のforループを使用して重み付き乱数(ランダム)の大きさとprizeWeight配列の各要素を走査して比較するのではなく、新しい重み配列をマージして生成し、ソートした後、Array.indexOf()関数を使用して重み付き乱数(ランダム)の添え字にインデックスを付け、この添え字に対応する賞品名を取得しました。

3. プロジェクトコードを完成させる

このサンプル プロジェクト js のコア コードは次のとおりです。

//layui モジュラー参照 layui.use(['jquery', 'util'], function(){
    var $ = layui.$、util = layui.util;
    
    // 賞品名、重量、当選数などの配列を設定します。 var Prizes = ["First Prize", "Second Prize", "Third Prize", "No Winner"]; // 賞品名の配列 var PrizeWeight = [1, 5, 20, 74]; // 賞品の重量の配列。各賞品が当選する確率の合計の割合を表します。例えば、一等賞の当選率は1%、二等賞の当選率は5%です。            
    
    // 開発者は賞の名前、重み、その他の配列を 1 つのオブジェクトで宣言することもできます // var Prizes = [
    // {"name": "一等賞", "weight": 1}, 
    // {"name": "2等賞", "weight": 5}, 
    // {"name": "3等賞", "weight": 20}, 
    // {"name": "勝てない", "weight": 74}
    //];                
    
    //配列の累積合計関数: Array.reduce(function(prev ,cuurentValue), initialValue)
    var weightSum = PrizeWeight.reduce(function(prev, currVal){ // 重量の合計を計算します: 1+5+20+74=100
        return prev + currVal; //prev は前回の累積後の値、currVal は今回追加される値です}, 0);
    document.getElementById("weightSum").innerhtml = weightSum; // 重みと値を設定する // 抽選関数 var lottery = function(weightSum) {
        var res = "当選なし"; // 抽選結果のデフォルト設定は "当選なし" です
        console.log("このプログラムの賞の重みと価値:", weightSum);
        
        // 0 から weightSum までのランダムな重みの数値を生成しますvar random = Math.random()*weightSum; // ランダムな重みの数値を生成します (0 から weightSum まで)
        console.log("この抽選のランダムな重み:", random);
        
        // 重み配列を再構成して並べ替えます var concatWeightArr = PrizeWeight.concat(random); // 重み配列にランダムな数値を追加します var sortedWeightArr = concatWeightArr.sort(function(a, b){return ab;}); // ランダムな数値を含む新しい重み配列を小さい順 (昇順) に並べ替えます console.log("ランダムな数値を含む新しい重み配列は昇順で並べ替えられています:", sortedWeightArr);
        
        // 重み付けされた乱数の配列インデックス var randomIndex = sortedWeightArr.indexOf(random); // 新しい重み配列内のインデックス付き乱数の位置 randomIndex = Math.min(randomIndex, Prizes.length -1); // 重み付けされた乱数のインデックスは賞品配列の長さ - 1 を超えてはなりません。賞品配列内の乱数のインデックス位置を再計算します console.log("この重み付けされた乱数に対応する配列インデックス:", randomIndex);
        
        //対応する賞品を取得します res = Prizes[randomIndex]; //賞品配列からこの抽選の結果を取得します console.log("この抽選の結果:", res);
        
        return {"weightSum": weightSum , "weightRandom": random, PrizeIndex: randomIndex, "data": res}; //この抽選の結果を返します};

    //ボタンイベントを登録する $('.layui-btn[data-type="save"]').on('click', function () {
        var res = lottery(weightSum);
        document.getElementById("dateNow").innerhtml = util.toDateString(new Date()); //この宝くじの時間を出力します document.getElementById("weightRandom").innerHTML = res.weightRandom; //この宝くじの加重乱数を出力します document.getElementById("printData").innerHTML = res.data; //この宝くじの結果を出力します //当選ルールのテキストのフォント色をリセットします $('.rule-body>p').css("color", "inherit");
        $('.rule-body>p:eq(' + res.prizeIndex + ')').css("color", "red");
    });
});

上記は、賞金の重さに基づいてJSが当選確率を計算する方法の詳細です。 JSが当選確率を計算する詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • jquery.rotate.js は、オプションの抽選番号と当選内容を含むターンテーブルの抽選コードを実装します。
  • js 制御乱数生成確率コード例
  • jsは確率に従って1、2、3、5の数字の生成を実現します
  • 重み確率分布を実現するための js 配列
  • js 確率計算(簡易版)
  • 確率によってランダムにイベントを生成するJavaScriptの詳細な説明
  • ランダム抽選機能を実現するJavaScript
  • 抽選機能を実現するjs
  • ネイティブJSが9マス宝くじを実現
  • jsで簡単な抽選機能を実現

<<:  Zabbix の psk 暗号化と zabbix_get 値の組み合わせ

>>:  CentOS 7 環境でソースコードから MySQL 5.7 をインストールする方法

推薦する

MySQL EXPLAIN ステートメントの使用例

目次1. 使用方法2. 出力結果1.id 2.選択タイプ3.表4.パーティション5.タイプ6.可能な...

JS ES6 変数分割代入の詳細な説明

目次1. 脱構築とは何か? 2. 配列の分割3. 配列モードと代入モードの統一4. デフォルト値の構...

Mysqlのマージ結果と水平スプライシングフィールドの実装手順

序文最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウント...

Google の新しい UI から学べること (画像とテキスト)

2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...

mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)

1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...

VMwareを使用したPermeateレンジシステムのインストール手順の詳細説明

1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...

HTML でよく使用されるエスケープ文字の概要

HTML でよく使用されるエスケープ文字をまとめると次のようになります。 &nbsp; 改行...

VMware 12 での Ubuntu 16.04 インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...

WeChat アプレットの日付と時刻のコンポーネント (年、月、日、時間、分)

この記事の例では、WeChatアプレットの日付と時刻コンポーネントの具体的なコードを参考までに共有し...

独自の YUM リポジトリを作成する手順

簡単に言うと、ウェアハウスとして使用される仮想マシンの IP は 192.168.149.129 で...

nginx プロキシ サーバーで双方向証明書検証を構成する方法

証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...

Ubuntu 18.04.4 に MySQL をインストールするプロセスの詳細な説明

Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...

Tableとdivの簡単な紹介と使い方

ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...

Tomcat で JNDI データ ソースを構成する 3 つの方法

これまでの仕事では、開発サーバーは一般的にTomcatでした。データソースは、多くの場合、appli...