電子抽獎程式

 這是一份Gemini AI專為藥局抽獎活動設計的單一 HTML 網頁程式碼。

它使用純 JavaScript 編寫,完全不需安裝任何軟體,只要將程式碼複製並儲存為 .html 檔案,即可直接在電腦、手機或平板的瀏覽器中開啟使用。為確保絕對的公平性與隨機性,本程式採用了時間戳記(毫秒級)作為隨機種子,並結合國際標準的 Fisher-Yates 洗牌演算法。每次按下抽獎,數字排列都會完全不同。

8月底前完成步驟及作業測試,9月15日在見證人之下,公開抽獎,隨即登入中獎名單。

9月15日當日診所及藥局都有例行診療及調劑領藥工作,人力不足,故採用電子抽獎作業,但一定會做到公開、公平、公正。




<div class="container">

    <h2>大獎爭奪戰 🎲 電子抽獎系統</h2>

    

    <div class="input-group">

        <label for="startNum">1. 開始數字(最小值)</label>

        <input type="number" id="startNum" value="1" placeholder="例如:1">

    </div>

    

    <div class="input-group">

        <label for="endNum">2. 結束數字(最大值)</label>

        <input type="number" id="endNum" value="100" placeholder="例如:100">

    </div>

    

    <div class="input-group">

        <label for="countNum">3. 需要抽出的整數個數</label>

        <input type="number" id="countNum" value="5" placeholder="例如:5">

    </div>

    

    <button onclick="generateLottery()">立即產生中獎號碼</button>

    

    <div class="result-box">

        <div class="result-title">🎯 中獎號碼排列:</div>

        <div id="resultList" class="result-list">(尚未開始抽獎)</div>

        <div id="seedInfo" class="seed-info"></div>

    </div>

</div>


<script>

// 自訂偽隨機數產生器 (SFC32 演算法),使用時間戳記作為種子

function sfc32(a, b, c, d) {

    return function() {

        a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;

        var t = (a + b) | 0;

        a = b ^ (b >>> 9);

        b = (c + (c << 3)) | 0;

        c = (c << 21) | (c >>> 11);

        d = (d + 1) | 0;

        t = (t + d) | 0;

        c = (c + t) | 0;

        return (t >>> 0) / 4294967296;

    }

}


function generateLottery() {

    // 1. 讀取輸入值

    const start = parseInt(document.getElementById('startNum').value);

    const end = parseInt(document.getElementById('endNum').value);

    const count = parseInt(document.getElementById('countNum').value);

    

    const resultListDiv = document.getElementById('resultList');

    const seedInfoDiv = document.getElementById('seedInfo');

2. 驗證輸入合法性

    if (isNaN(start) || isNaN(end) || isNaN(count)) {

        alert('請填寫所有輸入欄位!');

        return;

    }

    if (start > end) {

        alert('開始數字不能大於結束數字!');

        return;

    }

    

    const totalNumbers = end - start + 1;

    if (count > totalNumbers) {

        alert(`錯誤:設定的抽取個數 (${count}) 大於號碼總數 (${totalNumbers})!`);

        return;

    }

    if (count <= 0) {

        alert('抽取個數必須大於 0!');

        return;

    }


    // 3. 建立連續數字池

    let numberPool = [];

    for (let i = start; i <= end; i++) {

        numberPool.push(i);

    }


    // 4. 擷取當前時間(毫秒)作為亂數種子,確保每次執行、每一秒都絕對不同

    const timestamp = Date.now(); 

    

    // 使用時間戳記初始化隨機種子

    const rand = sfc32(timestamp, timestamp ^ 0xDEADBEEF, timestamp >> 32, 0);


    // 5. Fisher-Yates 洗牌演算法 (結合時間種子)

    for (let i = numberPool.length - 1; i > 0; i--) {

        // 使用基於時間種子的隨機數

        const j = Math.floor(rand() * (i + 1));

        // 交換元素

        const temp = numberPool[i];

        numberPool[i] = numberPool[j];

        numberPool[j] = temp;

    }


    // 6. 取出前 N 個號碼作為中獎結果

    const selectedNumbers = numberPool.slice(0, count);


    // 7. 渲染到網頁畫面上

    resultListDiv.innerHTML = selectedNumbers.join(' 、 ');

    

    // 顯示抽獎當下的時間與種子資訊,以昭公信

    const nowTime = new Date(timestamp);

    const timeString = nowTime.toLocaleTimeString('zh-TW', { hour12: false }) + '.' + String(nowTime.getMilliseconds()).padStart(3, '0');

    seedInfoDiv.innerHTML = `時間種子:${timestamp} (${timeString})`;

}

</script>


</body>

</html>

    

留言

這個網誌中的熱門文章

全球健康藥局

看看和你不一樣的人生經歷

「全球健康藥局」員工及協助伙伴