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 をインストールする方法
目次1. 使用方法2. 出力結果1.id 2.選択タイプ3.表4.パーティション5.タイプ6.可能な...
目次1. 脱構築とは何か? 2. 配列の分割3. 配列モードと代入モードの統一4. デフォルト値の構...
序文最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウント...
2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...
1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...
1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...
HTML でよく使用されるエスケープ文字をまとめると次のようになります。 改行...
この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...
この記事の例では、WeChatアプレットの日付と時刻コンポーネントの具体的なコードを参考までに共有し...
簡単に言うと、ウェアハウスとして使用される仮想マシンの IP は 192.168.149.129 で...
証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...
Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...
問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...
ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...
これまでの仕事では、開発サーバーは一般的にTomcatでした。データソースは、多くの場合、appli...