# Javascript 亂數抽籤語法學習日誌 `javascript` `randomnumber` `math.floor` ### 目錄 [toc] ## 一、課程摘要 #### 1.複習陣列基本語法 #### 2.亂數抽籤系統 思考如何做出差異化 #### 3.結合語音朗讀系統說出中獎人名單 ### 成果展示: [https://wastu01.github.io/Javascript-Random-from-array/](https://wastu01.github.io/Javascript-Random-from-array/) ```css! (請忽略奇怪的排版 ) .container{ display: flex; justify-content: center; align-items: flex-end; height: 90vh; } ``` ## 二、課程網路資源 #### 線上網頁程式編輯器 Codepen: https://codepen.io/ #### W3Cschool 中文版:https://www.w3school.com.cn/js/index.asp #### Math.random()語法說明: https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Math/random #### 如何讀本地文字檔進入JS https://www.geeksforgeeks.org/how-to-read-a-local-text-file-using-javascript/?ref=gcse 另一個是課堂所教 `<script id="text" src="data.txt"> ` https://stackoverflow.com/questions/30944764/javascript-create-array-from-local-file-txt https://www.runoob.com/ajax/ajax-xmlhttprequest-onreadystatechange.html ``` 存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。 0: 請求未初始化 1: 服務器連接已建立 2: 請求已接收 3: 請求處理中 4: 請求已完成,且響應已就緒 ``` https://stackoverflow.com/questions/14446447/how-to-read-a-local-text-file ## 三、重要指令語法 Javascript ### Math.random() 會回傳介於0到1之間(包含 0,不包含1) 的偽隨機數字 大致符合數學與統計上的均勻分佈 ``` function getRandom() { return Math.random(); } ``` //此方法不符合加密學安全性要求。請勿使用於任何加密、資安相關領域。 //**https://zhuanlan.zhihu.com/p/205359984** ### 隨機取出兩數值之間值(不包含最大值) **The returned value is no lower than (and may possibly equal) min, and is less than (and not equal) max.** **返回的值大於等於 最小值,且小於 最大值** e.g A, B, C, D, E, F, G 回傳數值區間包含A,不包含G ```javascript= function getRandomArbitrary(min, max) { return Math.random() * (max - min) + min; } ``` ### Math.floor() 將所有的小數無條件捨去到比該值小的最大整數 有點繞口但其實就是高斯符號的取底 ``` console.log(Math.floor(5.9999)); // expected output: 5 console.log(Math.floor(-5.05)); // expected output: -6 ``` 所以結合起來 Math.floor(Math.random()*7-0 + 0); // 回傳 0 到 6 其中一個『整數』 > 每個數字選中機率都一樣,所以可以拿來做抽籤 > 那個七也就代表陣列的長度 > 第幾位抽到就是 `回傳值+1` ### Math.ceil() 取大於的最小整數 ``` console.log(Math.ceil(.95)); // expected output: 1 console.log(Math.ceil(4)); // expected output: 4 ``` ### 首尾數值都包含且取整數 > 例如取得 4.9 到 9.9 之間的一個整數 > 5,6,7,8,9 整數用 floor, 包含最大值 +1 ```javascript= function getRandomIntInclusive(min, max) { min = Math.ceil(min); // min = 5 max = Math.floor(max); // max = 9 return Math.floor(Math.random() * (max - min + 1) + min); // Math.floor(Math.random()*5 + 5 } ``` 假設有一陣列 ``` array=[one,two,three,four]; ``` 隨機取出一位 ```htmlmixed= <p id="demo0"></p> <p id="demo1"></p> randomData() function randomData(){ let x = Math.floor(Math.random() * 陣列.length); let y = x + 1; document.getElementById("demo0").innerHTML = "第幾位:" + y; document.getElementById("demo1").innerHTML = "中獎人:" + array[x]; } ``` ## 四、學習心得 上週的書籍登入系統完成了 localstorage 的完整功能,雖然作業有基本架構即可,但對自己的挑戰以及最後有完成做出來,雖然還是有Bug但有成就感蠻開心的。 書籍登入系統儲存資料實作:[點我前往](https://wastu01.github.io/Javascript-LocalStorage/) * 本來規劃點選文字前方『X』icon 可以手動刪除特定項目 ( 下方使用 ChatGPT4 重構後的版本 ) ```javascript= const input = document.querySelector("#input"); const ul = document.querySelector("#list"); const btns = document.querySelectorAll(".btn"); const renderDiv = document.getElementById("render"); const countSpan = document.getElementById("Count"); let books = localStorage.getItem("data") ? JSON.parse(localStorage.getItem("data")) : []; function updateList() { ul.innerHTML = books.map((book, index) => `<li><a data-num=${index}><i class='fa-solid fa-circle-xmark'></i>${book}</a></li>`).join(""); countSpan.innerHTML = books.length; localStorage.setItem("data", JSON.stringify(books)); } updateList(); btns.forEach((btn, index) => { btn.addEventListener("click", () => { switch (index) { case 0: addBook(); break; case 1: toggleList(); break; case 2: loadDefaultData(); break; case 3: removeLastBook(); break; case 4: sortBooks(); break; case 5: clearBooks(); break; } }); }); function addBook() { const text = input.value.trim(); if (text) { books.push(text); input.value = ''; updateList(); } else { alert("請輸入書籍名稱"); } } function toggleList() { renderDiv.style.display = renderDiv.style.display === "none" ? "block" : "none"; btns[1].innerText = renderDiv.style.display === "none" ? "顯示資料" : "隱藏"; } function loadDefaultData() { const original = ["網頁設計", "物聯網設計", "CSS版型設計", "數位學習系統"]; books = [...books, ...original]; updateList(); } function removeLastBook() { if (books.length > 0) { books.pop(); updateList(); } else { alert("沒有可刪除的書籍"); } } function sortBooks() { books.sort(); updateList(); } function clearBooks() { books = []; updateList(); } ``` --- 本週心得: 這週主要是在學習製作亂數抽籤功能,有同學超前進度上課前把所有課堂練習做完了(所以也沒來上課?),所以就直接把程式碼下載看看是怎麼做到的再搭配院長的說明,還不錯的學習方式,~~希望下次同學也能先做完~~。不過這週還沒進到 blockly 的部分哦 另外,蠻重要的概念是,要怎麼做出差異化,技術跟語法其實大同小異,或者是善用網路資源即可獲得解答,像是外連 txt 檔案就是個不錯的方式,以及抽籤結合語音的方式,蠻特別的想法。 > 後來有找到用 `FileReader` 語法 > 使用者只要匯入一行一行的名單即可 > https://zh.javascript.info/file https://github.com/wastu01/Javascript-LocalFile-to-array 課後複習再把課程教學資源看過一遍,整理到上面的指令語法說明,唯有自己整理筆記才能內化知識,就這樣,這堂課蠻好的讓我有動力學習的東西。 > 下週課程:[隨機抽籤語音系統 物聯網系統與研究學習日誌](/wRMBYbFzTF-NCJ5BQYf7Pw)