Fortuna hay Mersenne Twister có thích hợp làm RNG thuật toán không?


19

Một câu trả lời gần đây đã đề cập đến việc sử dụng Máy tạo số ngẫu nhiên ( RNG ) của Fortuna hoặc Mersenne Twister để tạo ra một mô phỏng Monte Carlo . Tôi chưa nghe nói về Fortuna trước đây vì vậy tôi đã tra cứu nó - có vẻ như nó chủ yếu dành cho mục đích sử dụng mật mã.

Tôi hiện đang sử dụng Mersenne Twister trong mã sản xuất để tạo ra thuật toán K-Means.

Mà (Fortuna hoặc Mersenne Twister) được coi là tốt nhất cho các ứng dụng "gieo hạt thuật toán" (ví dụ: gieo hạt Monte Carlo và K-Means)? Hoặc là "tung lên" - tức là sử dụng thuận tiện nhất.

Từ nơi tôi đang ngồi, "tốt nhất" sẽ cung cấp các số ngẫu nhiên chất lượng cao nhất, hoạt động nhanh chóng và (có thể) có dấu chân bộ nhớ thấp. Trong số này, chất lượng có lẽ là quan trọng nhất đối với hầu hết chúng ta.


6
PRNG mã hóa có xu hướng chậm hơn so với hầu hết các PRNG khác; nếu bạn đang thực hiện một mô phỏng Monte Carlo trong đó hàng triệu hoạt động PRNG của bạn, bạn sẽ thấy các phương thức mã hóa rất tốn kém.
JM

1
@JM - Với một chi tiết nhỏ hơn, tôi nghĩ nhận xét của bạn sẽ tốt như một câu trả lời. Chắc chắn sẽ rất thú vị khi xem xét liệu chức năng mã hóa tăng tốc phần cứng hiện đại có thể được sử dụng để tạo ra một luồng hiệu suất cao của các số giả ngẫu nhiên được bảo mật bằng mật mã hay không.
Đánh dấu gian hàng

@JM điểm hay về RNG tiền điện tử bị chậm - đánh dấu với Fortuna
thắng

Đây là một danh sách tốt về PRNG và nhiều số liệu thống kê khác nhau mà bạn có thể thấy hy vọng hữu ích, nó giúp> boost.org/doc/libs/1_48_0/doc/html/boost_random/ trộm
pyCthon

Vấn đề của tôi với cstdlib là độ chi tiết - chỉ RAND_MAX=32768các giá trị có thể. Tôi hiện đang sử dụng MT cho sim raytracing Monte Carlo. Tuy nhiên, tôi không thấy MT là một nút cổ chai hiệu năng trong trình hồ sơ của mình, có lẽ vì tôi đang tạo ra những thứ "ngẫu nhiên" như các hướng tia như một tiền xử lý . Ví dụ: tôi có thể tạo ra một mảng gồm 100.000 tia khi khởi động, lưu trữ chúng trong một mảng và chọn ngẫu nhiên vị trí bắt đầu mảng khi chạy (chạy cho 10.000 tia hoặc hơn bộ sưu tập). Điều này có chi phí bộ nhớ tương đối cao, để đổi lấy phân phối số ngẫu nhiên tốt.
bobobobo

Câu trả lời:


14

Chà, mọi thứ đều là sự đánh đổi bằng cách này hay cách khác. Đối với các trình tạo số ngẫu nhiên, tôi nhóm chúng thành 3 loại cơ bản:

  1. Đủ tốt để làm bài tập
  2. Đủ tốt để đặt cược công ty của bạn vào.
  3. Đủ tốt để đặt cược đất nước của bạn vào.

Các PRNG tương đương tuyến tính (phương pháp thường được triển khai trong hầu hết các thư viện) đều nằm trong loại 1. Cả Fortuna và Mersenne Twister đều vững chắc trong loại 2.

Đối với một bài viết thú vị về cách làm rối một thuật toán xáo trộn có thể khiến bạn phải trả giá cho công ty / sòng bạc của mình, tôi khuyên bạn nên sử dụng bài viết này từ năm 1999 . Do mục nát liên kết, các hình ảnh đã biến mất, nhưng hình 4, hình mà bạn vẽ số tiếp theo ra khỏi PRNG so với số trước đó được tạo, là một tập hợp các đường song song.

Như JM chỉ ra, Fortuna chậm chạp. Như bạn đã chỉ ra, Mersenne Twister khá nhanh.


2
Nhanh chóng lướt qua phiên bản có thể in của bài viết , "hình 4" dường như là mã thay vì hình ảnh. "Hình 5" trông kaput, nhưng đây là hình ảnh tôi nhận được từ WayBack Machine .
JM

Cảm ơn. Có vẻ như tốc độ là một dấu ấn chống lại Fortuna trong trường hợp này. Re. Xáo trộn xấu: vâng tôi biết đủ (không nhiều!) Rằng rất dễ "hoàn tác" tính ngẫu nhiên của RNG - ví dụ, bằng cách chọn hạt giống khởi đầu xấu.
winwaed

Một phiên bản khác có hình ảnh đẹp hơn là tại: cigital.com/ con / doad / developer_gamble.php
Tangurena

1
LCG 96 bit với đầu ra 32 bit vượt qua các bài kiểm tra thống kê nhiều hơn Mersenne Twisters. Ngày nay, không ai nên sử dụng Mersenne Twister, vì thật dễ dàng để tạo ra các PRNG phi mã hóa tốt, tốt hơn nhiều so với MT về mọi mặt.
Veedrac

4

Sự lựa chọn mặc định trong danh mục "mật mã" là Blum-Blum-Shub , tôi nghĩ vậy. Như trang wikipedia đã nói, điều này không phù hợp với mô phỏng vì nó quá chậm.

Nếu bạn đang chạy trên một hệ thống giống như unix, thì bạn cũng có thể xem xét nhận số ngẫu nhiên trực tiếp từ / dev / urandom , dịch vụ hệ điều hành cung cấp các số ngẫu nhiên chất lượng tốt (mặc dù không nhất thiết là tiền điện tử). Tùy thuộc vào hệ điều hành cụ thể mà bạn đang sử dụng, điều này có thể sử dụng thuật toán Yarrow - trong đó Fortuna là một biến thể. Nhưng khía cạnh thú vị nhất là hệ điều hành có quyền truy cập vào một số con số ngẫu nhiên thực sự: ví dụ nhiễu nhiệt từ cảm biến nhiệt độ bên trong. Thông thường, dữ liệu này được trộn vào nhóm ngẫu nhiên bất cứ khi nào có sẵn để giữ cho dữ liệu không thể đoán trước.

Khái niệm pha trộn ngẫu nhiên này cho thấy rằng có thể có được điều tốt nhất của cả hai thế giới như sau. Sử dụng một trình tạo số ngẫu nhiên nhanh hơn, chất lượng hợp lý tốt như Mersenne làm RNG cơ bản của bạn. Duy trì một bộ tạo số ngẫu nhiên thứ hai, chất lượng tốt hơn - ví dụ như Fortuna. Cứ sau 25 số, hãy chạy một số lần lặp RNG tốt hơn và thêm kết quả vào trạng thái RNG cơ bản của bạn. Bằng cách này bạn sẽ có được hiệu suất khá cao và kết quả chất lượng khá cao. (Tôi đoán nó sẽ vô dụng đối với tiền điện tử, bởi vì sức mạnh của trình tạo tổng hợp này có thể là sức mạnh của liên kết yếu nhất. Nhưng đối với mô phỏng, nơi bạn thường không có đối thủ độc hại, nó có thể hoạt động.)


/ dev / urandom được bảo mật để sử dụng cho mật mã trên linux và free-bsd. Nhìn vào câu trả lời này
Adam Kurkiewicz 24/8/2015

Đối với mô phỏng, tại sao nó lại là một tính năng mong muốn cho các số ngẫu nhiên là đúng? Chắc chắn, một số trình tạo số giả ngẫu nhiên tồi tệ hơn, nhưng những người khác sẽ ngang bằng với tất cả các mục đích thực tế. Vì vậy, tại sao bạn coi sự thật là một tính năng tốt?
Wrzlprmft

2

Tôi muốn nhấn mạnh rằng, gần đây tôi đã trải qua quá trình này với một mô phỏng và tôi nên lưu ý rằng việc sử dụng Fortuna không phải là vấn đề nếu nó thực sự cần thiết. Trong trường hợp của chúng tôi, chúng tôi đã lo ngại rằng entropy của MT không đủ cao để biến sự mô phỏng của chúng tôi thành sai lệch. Vì vậy, để mô phỏng, chúng tôi đã sử dụng Fortuna lấy khoảng 65 tỷ số ngẫu nhiên từ thuật toán đó. Điểm là, máy tính rất nhanh, nếu bạn thực sự cần bạn có thể sử dụng nó nếu bạn có lý do. Nếu bạn chỉ đang làm một cái gì đó như tích hợp monte carlo, hãy gắn bó với MT.


0

Tôi nghĩ rằng câu trả lời phụ thuộc rất nhiều vào ứng dụng mà bạn dự định sử dụng RNG. Tôi muốn đề xuất một danh mục thứ tư cho phân loại sơ bộ của Tangurena: "Tốt mà không có lợi ích thực sự".

Đối với nhiều ứng dụng, điều đó có thể đơn giản là không quan trọng và RNG cấp mã hóa đúng có thể chỉ đơn giản là làm chậm các nhiệm vụ của bạn mà không có bất kỳ lợi ích tương xứng nào. Ví dụ, phần lớn nghiên cứu tôi thực hiện chỉ yêu cầu nhiều, nhiều triệu số đến từ phân phối tôi chỉ định. Hầu như bất kỳ RNG nào cũng sẽ làm được, vì vậy tất cả những gì tôi cần là một thứ không quá tệ đến mức không có giá trị như một RNG. Bất cứ điều gì khác chỉ đơn giản là làm chậm công việc không cần thiết. Tôi có xu hướng sử dụng Mersenne Twister, nhưng điều đó đơn giản là vì nó hoạt động đủ tốt, tôi có mã và nó khá nhanh.

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.