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. ラッキードローのルール
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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Zabbix の psk 暗号化と zabbix_get 値の組み合わせ
>>: CentOS 7 環境でソースコードから MySQL 5.7 をインストールする方法
この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...
序文MySQL は、強力なクエリ機能、高いデータ一貫性、高いデータ セキュリティ、およびセカンダリ ...
ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...
Lottie は、Airbnb が開発した iOS、Android、React Native 向けの...
例:場所のルートとエイリアスルートディレクティブは、ルートによって設定されたディレクトリに検索ルート...
データベース アプリケーションは、アプリケーション システムに不可欠な部分です。リレーショナル デー...
インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...
場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...
1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...
目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...
目次1. 自己列挙可能なプロパティ2. Object.values()はプロパティ値を返します3. ...
初めて書きます。自己紹介させてください...みなさんこんにちは。私はジャスミンです。なぜジャスミンと...
Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...
目次1. 実施計画の概要2. 実行計画の実践id:選択タイプ:テーブル:タイプ:可能なキー:鍵:キー...
序文今日、オープンソース プロジェクトのフィードバック フォームを設計していたところ、絵文字表現を挿...