Nguồn gốc của thuật toán ngẫu nhiên `(seed * 9301 + 49297)% 233280`?


9

Nếu bạn tìm kiếm các ví dụ về việc tạo trình tạo số ngẫu nhiên (giả), bạn sẽ gặp phải những thứ như thế này (ví dụ cụ thể 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);
}

Những con số cụ thể đó (9301, 49297, 233280) và thuật toán được sử dụng nhiều lần, nhưng dường như không ai có tài liệu tham khảo chính xác cho việc này. Ai đã phát minh ra thuật toán này và thử nghiệm phân phối? Có một bài báo hoặc một cái gì đó để trích dẫn?


5
đó là một trình tạo đồng dạng tuyến tính nhưng với một khoảng thời gian khá nhỏ (chỉ 233k trong khi int 32 bit cho phép có thời gian 4 tỷ
ratchet freak

1
Mọi người thường sao chép mã trực tiếp từ sách, vì vậy có lẽ nó từ một cuốn sách cũ ở đâu đó và đã được sao chép nhiều lần. Nó cũng có vẻ là một trường hợp hạn chế. Có thể hữu ích: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/... ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
Dù nguồn gốc là gì, đó là những giá trị khủng khiếp được sử dụng để tính toán hạt giống.

3
@jlarson một nhận xét không đủ dài, nhưng có hai vấn đề trong tay. Đầu tiên, như ratchet freak ám chỉ, modulo là khoảng thời gian tối đa : số lượng số duy nhất trước khi máy phát lặp lại chính nó. Thời gian thực tế có thể nhỏ hơn. Thứ hai, hai số còn lại (chủ yếu là bội số) nên tương đối nguyên tố với số modulo để đảm bảo thời gian dài hơn. Lý tưởng nhất là số modulo là số nguyên tố lớn nhất nhỏ hơn số nguyên dương tối đa phù hợp với kiểu dữ liệu và hai số còn lại cũng là số nguyên tố lớn.

1
Đó là phiên bản ngắn, ngắn về lý do tại sao những con số đó là khủng khiếp, vì đây là một cuộc thảo luận bên lề và thêm một câu trả lời thực tế là không phù hợp cho câu hỏi này. Tôi khuyên bạn nên lướt qua Wikipedia và có thể là Toán học hoặc Khoa học Máy tính để biết thêm thông tin, mặc dù thuật toán số giả về mặt kỹ thuật cũng là chủ đề tại Lập trình viên.

Câu trả lời:


7

Tìm kiếm nhanh trên Google Sách cho thấy những con số này (9301, 49297, 233280) đã được sử dụng trong một số tài liệu tham khảo:

  • Bí quyết số trong FORTRAN 77
  • Giới thiệu về phương pháp số trong C ++
  • Tài nguyên của nhà phát triển CGI: Lập trình web trong TCL và PERL
  • Fortran 77 hiệu quả cho các kỹ sư và nhà khoa học
  • Phát triển JavaScript
  • Tất cả trên C
  • Ví dụ Java trong một Nutshell
  • Thuật toán chuyên ngành
  • Giới thiệu về cơ học

Lâu đời nhất là phương pháp Máy tính để tính toán toán học năm 1977 của George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall), mặc dù Google không hiển thị nơi văn bản được sử dụng trong sách để không thể xác minh được.

Văn bản hiển thị sớm nhất là Công thức toán số trong Pascal (Ấn bản đầu tiên): Nghệ thuật tính toán khoa học , Tập 1 của báo chí, Teukolsky, Vetterling và Flannery trong một bảng toàn trang "Hằng số cho các bộ tạo số ngẫu nhiên di động". Những con số cụ thể này được đưa ra với mức tràn tại 2 ^ 31.

Bộ sách Bí quyết số rất phổ biến và đã được in từ năm 1986.


1
Ồ, nếu câu trả lời không có ở đây thì tôi không biết nó sẽ ở đâu. Cảm ơn .. // Tôi đã hy vọng có thể chỉ ra một số nghiên cứu cụ thể về lý do tại sao những con số này là đặc biệt, nhưng điều này đủ. 9301 là sản phẩm của hai số nguyên tố (71x131), 49297 là số nguyên tố - theo bản năng tôi cảm thấy như thế phải có liên quan. 233280 không phải là số nguyên tố - nó bằng 2x2x2x2x2x2x3x3x3x3x3x3x5 (hoặc 2 ^ 6 * 3 ^ 5 * 5)
jlarson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.