แหล่งดั้งเดิมของ `(เมล็ด * 9301 + 49297) อัลกอริธึม% 233280` แบบสุ่มหรือไม่


9

หากคุณค้นหาตัวอย่างของการสร้างตัวสร้างตัวเลขแบบสุ่ม (หลอก) คุณจะพบสิ่งเช่นนี้ (ตัวอย่างเฉพาะhttp://indiegamr.com/generate-repeatable-random-numbers-in-js/ ):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

หมายเลขเฉพาะเหล่านั้น (9301, 49297, 233280) และอัลกอริทึมถูกนำมาใช้ซ้ำไปซ้ำมา แต่ไม่มีใครดูเหมือนจะมีการอ้างอิงที่ชัดเจนสำหรับเรื่องนี้ ใครเป็นผู้คิดค้นอัลกอริทึมนี้และทดสอบการกระจายตัว? มีกระดาษหรืออะไรที่จะอ้างถึง?


5
มันเป็นตัวกำเนิดสมการเชิงเส้นแต่มีช่วงเวลาที่ค่อนข้างเล็ก (เพียง 233k ในขณะที่ 32 บิตอนุญาตให้มีช่วงเวลา 4 พันล้าน
วงล้อประหลาด

1
ผู้คนมักจะคัดลอกรหัสโดยตรงจากหนังสือดังนั้นมันอาจมาจากหนังสือเล่มเก่าที่อื่นและถูกคัดลอกมาหลายครั้ง มันก็ดูเหมือนจะเป็นกรณีที่ จำกัด อาจเป็นประโยชน์: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/… ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
ไม่ว่าต้นกำเนิดจะเป็นค่าใดที่น่ากลัวสำหรับใช้ในการคำนวณเมล็ด

3
@ jlarson ความคิดเห็นไม่นานพอ แต่มีสองประเด็น อย่างแรกคือเมื่อ ratchet freak พูดถึงโมดูโลคือระยะเวลาสูงสุด : จำนวนตัวเลขที่ไม่ซ้ำกันก่อนที่ตัวกำเนิดจะทำซ้ำตัวเอง ช่วงเวลาจริงอาจมีขนาดเล็กลง ประการที่สองตัวเลขสองตัวอื่น ๆ (ส่วนใหญ่เป็นตัวคูณ) ควรจะค่อนข้างสำคัญกับหมายเลขโมดูโลเพื่อให้แน่ใจว่าเป็นเวลาที่นานขึ้น ตามหลักแล้วหมายเลขโมดูโลนั้นเป็นไพร์มที่ใหญ่ที่สุดที่น้อยกว่าจำนวนเต็มบวกสูงสุดที่เหมาะกับประเภทข้อมูลและอีกสองตัวเลขก็เป็นช่วงที่มีขนาดใหญ่

1
นั่นคือรุ่นสั้น ๆ สั้น ๆ ว่าทำไมตัวเลขเหล่านั้นแย่มากเพราะนี่เป็นการสนทนาด้านข้างและการเพิ่มคำตอบที่แท้จริงนั้นไม่เหมาะสมสำหรับคำถามนี้ ฉันขอแนะนำให้ตีกลับวิกิพีเดียและอาจคณิตศาสตร์หรือวิทยาการคอมพิวเตอร์สำหรับข้อมูลเพิ่มเติมแม้ว่าอัลกอริทึมปลอมตัวเลขทางเทคนิคก็ยังอยู่ในหัวข้อที่โปรแกรมเมอร์

คำตอบ:


7

การค้นหาอย่างรวดเร็วของ Google หนังสือแสดงตัวเลขเหล่านี้ (9301, 49297, 233280) มีการใช้ในการอ้างอิงจำนวน:

  • สูตรอาหารต่าง ๆ ใน FORTRAN 77
  • บทนำของวิธีเชิงตัวเลขใน C ++
  • ทรัพยากรของนักพัฒนา CGI: การเขียนโปรแกรมเว็บใน TCL และ PERL
  • ฟอร์แทรน 77 มีประสิทธิภาพสำหรับวิศวกรและนักวิทยาศาสตร์
  • การพัฒนา JavaScript
  • ทั้งหมดใน C.
  • ตัวอย่าง Java สั้น ๆ
  • ขั้นตอนวิธีเชิงตัวเลข
  • กลศาสตร์เบื้องต้น

ที่เก่าแก่ที่สุดคือวิธีคอมพิวเตอร์ในปี 1977 สำหรับการคำนวณทางคณิตศาสตร์โดย George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall) แม้ว่า Google จะไม่แสดงข้อความที่ใช้ในหนังสือดังนั้นจึงไม่สามารถตรวจสอบได้

การแสดงข้อความที่เร็วที่สุดคือสูตรตัวเลขใน Pascal (ฉบับพิมพ์ครั้งแรก): ศิลปะการคำนวณทางวิทยาศาสตร์เล่มที่ 1โดยการกด Teukolsky, Vetterling และ Flannery ในตารางเต็มหน้าของ "ค่าคงที่สำหรับเครื่องกำเนิดเลขสุ่มแบบพกพา" หมายเลขเฉพาะเหล่านี้จะได้รับพร้อมกับการล้นที่ 2 ^ 31

สูตรตัวเลขชุดของหนังสือที่เป็นที่นิยมอย่างสูงและได้รับการตีพิมพ์ตั้งแต่ปี 1986


1
ว้าวถ้าคำตอบไม่ได้อยู่ที่นี่ฉันไม่รู้ว่ามันจะอยู่ตรงไหน ขอบคุณ .. // ฉันหวังว่าจะสามารถชี้การวิจัยเฉพาะบางอย่างเกี่ยวกับสาเหตุที่ตัวเลขเหล่านี้มีความพิเศษ แต่พอเพียงนี้ 9301 เป็นผลคูณของสองช่วงเวลา (71x131) 49297 เป็นนายก - สัญชาตญาณฉันรู้สึกว่ามันต้องเกี่ยวข้องกัน 233280 ไม่ได้สำคัญ - มันเท่ากับ 2x2x2x2x2x2x3x3x3x3x3x3x3x5 (หรือ 2 ^ 6 * 3 ^ 5 * 5)
jlarson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.