คำตอบง่ายๆสำหรับคำถามของคุณคือMath.random()
ละเมิดกฎ # 2
คำตอบอื่น ๆ อีกมากมายที่นี่ชี้ให้เห็นว่าการมีอยู่ของMath.random()
วิธีการที่ฟังก์ชันนี้ไม่บริสุทธิ์ แต่ฉันคิดว่ามันคุ้มที่จะบอกว่าทำไม Math.random()
taints ถึงใช้งาน
เช่นเดียวกับตัวสร้างหมายเลขหลอกทั่วไปMath.random()
เริ่มต้นด้วยค่า "เมล็ดพันธุ์" จากนั้นจะใช้ค่านั้นเป็นจุดเริ่มต้นสำหรับห่วงโซ่ของการปรับบิตระดับต่ำหรือการดำเนินการอื่น ๆ ที่ส่งผลให้ผลลัพธ์ที่ไม่สามารถคาดเดาได้ (แต่ไม่ใช่แบบสุ่มจริงๆ)
ใน JavaScript กระบวนการที่เกี่ยวข้องขึ้นอยู่กับการนำไปใช้งานและแตกต่างจากภาษาอื่น ๆ JavaScript ไม่มีวิธีเลือกเมล็ดพันธุ์ :
การใช้งานจะเลือกเมล็ดเริ่มต้นให้กับอัลกอริทึมการสร้างตัวเลขแบบสุ่ม ผู้ใช้ไม่สามารถเลือกหรือรีเซ็ตได้
นั่นเป็นเหตุผลที่ฟังก์ชันนี้ไม่บริสุทธิ์: JavaScript ใช้พารามิเตอร์ของฟังก์ชันโดยนัยที่คุณไม่สามารถควบคุมได้ มันอ่านพารามิเตอร์นั้นจากข้อมูลที่คำนวณและเก็บไว้ที่อื่นดังนั้นจึงละเมิดกฎ # 2 ในคำจำกัดความของคุณ
หากคุณต้องการที่จะทำให้เรื่องนี้เป็นฟังก์ชั่นที่บริสุทธิ์คุณสามารถใช้เป็นหนึ่งในทางเลือกที่เครื่องกำเนิดไฟฟ้าจำนวนสุ่มอธิบายไว้ที่นี่ เรียกเครื่องกำเนิดไฟฟ้าseedable_random
นั้น ใช้เวลาหนึ่งพารามิเตอร์ (เมล็ดพันธุ์) และส่งกลับตัวเลข "สุ่ม" แน่นอนว่าตัวเลขนี้ไม่ได้สุ่มเลย มันถูกกำหนดโดยเมล็ดพันธุ์โดยเฉพาะ นั่นเป็นเหตุผลว่าทำไมจึงเป็นฟังก์ชันที่บริสุทธิ์ ผลลัพธ์ของseedable_random
เป็นเพียง "สุ่ม" ในแง่ที่ว่าการคาดเดาผลลัพธ์ตามอินพุตนั้นทำได้ยาก
เวอร์ชันบริสุทธิ์ของฟังก์ชันนี้จะต้องใช้พารามิเตอร์สามตัว :
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
สำหรับ(min, max, seed)
พารามิเตอร์สามตัวใด ๆ ที่กำหนดสิ่งนี้จะให้ผลลัพธ์เดียวกันเสมอ
โปรดทราบว่าหากคุณต้องการให้ผลลัพธ์seedable_random
เป็นแบบสุ่มอย่างแท้จริงคุณต้องหาวิธีสุ่มเมล็ดพันธุ์! และกลยุทธ์ใดก็ตามที่คุณใช้ย่อมไม่บริสุทธิ์เพราะคุณต้องรวบรวมข้อมูลจากแหล่งที่มานอกหน้าที่ของคุณ ในฐานะที่เป็นmtraceurและjpmc26เตือนฉันนี้รวมถึงทุกวิธีทางกายภาพ: เครื่องกำเนิดไฟฟ้าจำนวนสุ่มฮาร์ดแวร์ , เว็บแคมกับหมวกเลนส์ , สะสมเสียงบรรยากาศ - แม้โคมไฟลาวา สิ่งเหล่านี้เกี่ยวข้องกับการใช้ข้อมูลที่คำนวณและจัดเก็บนอกฟังก์ชัน
Math.random()
สิ่งที่เปลี่ยนสถานะของ RNG