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 をインストールする方法

推薦する

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

MySQLクエリ最適化分析チュートリアルをステップバイステップで教えます

序文MySQL は、強力なクエリ機能、高いデータ一貫性、高いデータ セキュリティ、およびセカンダリ ...

uniAppエディタWeChatスライド問題について

ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...

React NativeプロジェクトでLottieアニメーションを使用する方法

Lottie は、Airbnb が開発した iOS、Android、React Native 向けの...

nginx のロケーションで URI の傍受を実装する方法

例:場所のルートとエイリアスルートディレクティブは、ルートによって設定されたディレクトリに検索ルート...

Win10でのMySQL5.7.17無料インストール版の基本設定チュートリアルについて(画像とテキスト付き)

データベース アプリケーションは、アプリケーション システムに不可欠な部分です。リレーショナル デー...

MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)

インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...

display または visibility を通じて HTML 要素を表示または非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...

Vue ユニットテストに関する予備調査

目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...

JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

目次1. 自己列挙可能なプロパティ2. Object.values()はプロパティ値を返します3. ...

Docker デプロイメントサービスの落とし穴を登る過程の詳細

初めて書きます。自己紹介させてください...みなさんこんにちは。私はジャスミンです。なぜジャスミンと...

Docker を使用して Jenkins をインストールするためのサンプル コード

Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...

MySQL実行計画を学ぶ

目次1. 実施計画の概要2. 実行計画の実践id:選択タイプ:テーブル:タイプ:可能なキー:鍵:キー...

MySQLに絵文字表現を挿入する方法

序文今日、オープンソース プロジェクトのフィードバック フォームを設計していたところ、絵文字表現を挿...