161803398 có phải là số 'Đặc biệt' không? Bên trong Math.Random ()


162

Tôi nghi ngờ câu trả lời là ' Vì toán học ', nhưng tôi đã hy vọng ai đó có thể cung cấp thêm một chút cái nhìn sâu sắc ở cấp độ cơ bản ...

Tôi đã tìm hiểu về mã nguồn BCL ngày hôm nay, xem xét một số lớp tôi đã sử dụng trước đây đã thực sự được triển khai như thế nào. Tôi chưa bao giờ nghĩ về cách tạo số ngẫu nhiên (giả) trước đây, vì vậy tôi quyết định xem nó đã được thực hiện như thế nào.

Nguồn đầy đủ ở đây: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Giá trị MSEED này được sử dụng mỗi khi lớp Random () được gieo.

Dù sao, tôi đã thấy 'số ma thuật' này - 161803398 - và tôi không có ý tưởng rõ ràng nhất về lý do tại sao số đó được chọn. Đây không phải là số nguyên tố hay lũy thừa của 2. Nó không phải là 'một nửa' đối với một số có vẻ quan trọng hơn. Tôi nhìn nó ở dạng nhị phân và hex và tốt, nó trông giống như một con số đối với tôi.

Tôi đã thử tìm kiếm số trong Google, nhưng tôi không tìm thấy gì.



6
@ 48klocs: Nó nói như vậy trong các tài liệu :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Tốt

4
@ 48klocs Có, trang 283 tại đây: apps.nrbook.com/c/index.html Lý do của anh ấy có vẻ là "vì toán học".
eshs

22
@eshs: Thực tế thú vị: Trang 283 của liên kết của bạn hiển thị inextp = 31;, nhưng mã nguồn của Randomlớp có inextp = 21;vì ai đó đã nhập sai nó gây ra lỗi này .
Jesse Tốt

7
@Izkata Chúng tôi cần giáo dục người dùng về hành vi đúng (không bỏ phiếu để đóng sai) cho mục tiêu dài hạn về chất lượng trang web, không chỉ nhắm đến mục tiêu ngắn hạn (không có câu hỏi cụ thể nào đóng). Và nếu tôi không chỉ ra các ý kiến ​​trên, nó có thể đã bị đóng như một bản sao vì đôi khi mọi người làm điều đó.
Bernhard Barker

Câu trả lời:


141

Không, nhưng nó dựa trên Phi ("tỷ lệ vàng").

161803398 = 1.61803398 * 10^8  φ * 10^8

Thêm về tỷ lệ vàng ở đây .

Và một bài đọc thực sự tốt cho các nhà toán học thông thường ở đây .

Và tôi đã tìm thấy một bài nghiên cứu về các trình tạo số ngẫu nhiên đồng ý với khẳng định này. (Xem trang 53.)


17
Bạn có biết tại sao một số dựa trên Phi làm cho một lựa chọn tốt như một hạt giống? Có thể tóm tắt điều này ở đây?
Bernhard Barker

29
@Dukeling Hằng số được sử dụng chính xác một lần, để làm dịu hạt giống đến. Sự nghi ngờ rất mạnh mẽ của tôi là nó được chọn là số không có trong tay áo của tôi để ngăn hạt giống với một vài bit (có lẽ là một lựa chọn phổ biến) làm hỏng bộ tạo số ngẫu nhiên (thay vì một số thuộc tính ma thuật của phi).
David Eisenstat

7
Để trích dẫn một trích dẫn từ cuốn sách đã nói Theo Knuth, bất kỳ MBIG lớn nào và bất kỳ MSEED nhỏ hơn (nhưng vẫn lớn) đều có thể được thay thế cho các giá trị trên. Vì vậy, đó là niềm vui toán học, ít nhiều .. Vì vậy, câu trả lời đúng phải là: Không. Nhưng nó dựa trên Phi.
TaW

14
Chỉ cần xem qua tờ giấy số ngẫu nhiên đó - dòng này nổi bật lên một chút - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(trang 4)
jcw

2
Tôi nghĩ rằng một cách phù hợp hơn để sử dụng tỷ lệ vàng sẽ là sử dụng (mô đun / phi) thay vì sử dụng biểu diễn cơ số 10 của các chữ số trong mã không liên quan gì đến cơ sở 10. Một đặc điểm thú vị của phi Tôi không thấy trên trang đó là từ những gì tôi có thể nói, với bất kỳ số nguyên N nào, giá trị N / phi-int (N / phi)> = 1 / N / sqrt (5). Điều đó có nghĩa là ngay cả khi một người tạo ra một chuỗi các số N / phi-int (N / phi), khoảng cách giữa các cặp gần nhất sẽ nằm trong một yếu tố của sqrt (5) của khoảng cách đồng đều lớn nhất có thể có trong khoảng ( 0..1)
supercat

62

Con số này được lấy từ tỷ lệ vàng 1.61803398 * 10 ^ 8 . Matt đã đưa ra một câu trả lời hay, con số này là gì, do đó tôi sẽ chỉ giải thích một chút về thuật toán.

Đây không phải là một số đặc biệt cho thuật toán này. Thuật toán là thuật toán tạo số ngẫu nhiên trừ của Knuth và các điểm chính của nó là:

  • lưu trữ một danh sách tròn gồm 56 số ngẫu nhiên
  • Khởi tạo là quá trình điền vào danh sách, sau đó chọn ngẫu nhiên các giá trị đó bằng thuật toán xác định cụ thể
  • hai chỉ số được giữ cách nhau 31
  • số ngẫu nhiên mới là sự khác biệt của hai giá trị ở hai chỉ số
  • lưu trữ số ngẫu nhiên mới trong danh sách

Trình tạo dựa trên đệ quy sau: X n = (X n-55 - X n-24 ) mod m, trong đó n ≥ 0. Đây là trường hợp một phần của trình tạo Fibonacci bị trễ : X n = (X n-j @ X n-k ) mod m, trong đó 0 <k <j và @ là bất kỳ hoạt động nhị phân nào (trừ, cộng, xor).

Có một số triển khai của máy phát điện này. Knuth cung cấp một triển khai trong FORTRAN trong cuốn sách của mình. Tôi tìm thấy đoạn mã sau , với nhận xét sau:

PARAMETER (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

Theo Knuth, bất kỳ MBIG lớn nào và bất kỳ MSEED nhỏ hơn (nhưng vẫn lớn) đều có thể được thay thế cho các giá trị trên.

Một chút nữa có thể được tìm thấy ở đây Lưu ý, rằng đây thực sự không phải là một bài nghiên cứu (như đã nêu của Toán học), đây chỉ là một luận văn thạc sĩ.

Người dân ở mật mã như sử dụng số hợp lý ( pi, e, sqrt(5)) vì có một phỏng đoán rằng chữ số của số đó xuất hiện với tần số bằng nhau và do đó có cao entropy . Bạn có thể tìm thấy câu hỏi liên quan này trên stackexchange để tìm hiểu thêm về những con số như vậy. Đây là một trích dẫn:

"Nếu các hằng số được chọn ngẫu nhiên, thì với xác suất cao, sẽ không có kẻ tấn công nào có thể phá vỡ nó." Nhưng các nhà mật mã học, là một người hoang tưởng, tỏ ra nghi ngờ khi ai đó nói: "Hãy sử dụng bộ hằng số này. Tôi đã chọn chúng một cách ngẫu nhiên, tôi thề ." Vì vậy, như một sự thỏa hiệp, họ sẽ sử dụng các hằng số như, giả sử, sự mở rộng nhị phân của π. Mặc dù chúng tôi không còn có lợi ích toán học khi chọn chúng ngẫu nhiên từ một số lượng lớn số, nhưng ít nhất chúng tôi có thể tự tin hơn khi không có sự phá hoại.


5
Đối với người trả lời, không chỉ vì entropy của họ, mà còn bởi vì những con số đó tăng gấp đôi so với số tay áo của tôi .
Cole Johnson
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.