2009-10-12 34 views
10

xem xét mã như thế này (Python):Hạt giống ngẫu nhiên khác nhau cần phải như thế nào?

import random 

for i in [1, 2, 3, 4]: 
    random.seed(i) 
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers 
    doStuff(randNumbers) 

Tôi muốn chắc chắn rằng randNumbers khác nhau đáng kể từ một cuộc gọi khác. Tôi có cần phải đảm bảo rằng số lượng hạt giống khác nhau đáng kể giữa các lần gọi tiếp theo, hoặc là đủ để các hạt giống khác nhau (không có vấn đề làm thế nào)?

Đối với pedants: xin vui lòng nhận mã trên là siêu quá đơn giản

+0

"khác biệt đáng kể", trong ngữ cảnh của các trình tạo số ngẫu nhiên, có thể có nghĩa là nhiều thứ khác nhau. Có những thử nghiệm cụ thể về tính ngẫu nhiên mà bạn đang xem và không phải là hiện tại không? Các PRNG điển hình có thời gian nhiều, dài hơn 100 số. Thông thường, người ta thấy một sự kiện gieo giống duy nhất từ ​​một đồng hồ hệ thống. Sử dụng cùng một giá trị giống như bạn làm sẽ tạo ra cùng một chuỗi ngẫu nhiên giả mỗi lần. – Mikeb

+0

Bạn có thể giải thích tại sao bạn muốn số ngẫu nhiên giả của bạn khác biệt đáng kể không? Không phải là đánh bại mục đích của các số ngẫu nhiên nếu bạn yêu cầu độ lệch - từ quan điểm thống kê, bạn có khả năng nhận được hai số gần nhau theo trình tự khi bạn ở xa nhau (nếu chúng thật sự ngẫu nhiên) –

Trả lời

8

Câu trả lời ngắn gọn: Tránh tái tạo giống, vì nó không mua cho bạn bất cứ thứ gì ở đây. Câu trả lời dài bên dưới.


Tất cả phụ thuộc vào chính xác những gì bạn cần. Trong Common defects in initialization of pseudorandom number generators nó được vạch ra rằng hạt giống phụ thuộc tuyến tính (trong đó 1, 2, 3, 4 chắc chắn là) là một lựa chọn tồi để khởi tạo nhiều PRNG, ít nhất là khi được sử dụng để mô phỏng và mong muốn kết quả không tương quan.

Nếu tất cả những gì bạn làm là lăn một vài con xúc xắc, hoặc tạo ra một số đầu vào giả ngẫu nhiên cho một cái gì đó không quan trọng, thì rất có thể không quan trọng.

Cũng lưu ý rằng việc sử dụng một số lớp của bản thân PRNG để tạo hạt giống có cùng một vấn đề trong việc tạo số phụ thuộc tuyến tính (LCG từ đầu đến cuối).

2

Nói chung, bạn chỉ gieo rắc bộ tạo số ngẫu nhiên của bạn khi bạn cần những con số ngẫu nhiên được tạo ra trong thời trang giống hệt nhau mỗi lần qua . Điều này rất hữu ích khi bạn có một thành phần ngẫu nhiên để xử lý của bạn, nhưng cần phải kiểm tra nó và do đó muốn nó được nhất quán giữa các bài kiểm tra. Nếu không, bạn để hệ thống tự tạo hạt giống cho trình tạo.

Trong các từ khác, bằng cách gieo trình tạo số ngẫu nhiên với các hạt giống được xác định trước cụ thể, bạn đang thực sự làm giảm sự ngẫu nhiên của toàn bộ hệ thống. Các số ngẫu nhiên được tạo ra khi sử dụng hạt giống 1 thực sự khác biệt với psuedo với hạt giống 2, nhưng một hạt giống được mã hóa cứng sẽ dẫn đến các chuỗi ngẫu nhiên lặp lại trong mỗi lần chạy chương trình.

0

Hạt giống nên ngẫu nhiên để đầu ra không thể đoán trước được. Có thể có vấn đề nếu hạt giống chỉ khác nhau ở một hoặc hai bit (như this question chứng minh).

+1

thường ngụ ý rằng đầu ra không cần phải không thể đoán trước được. Và bao nhiêu hạt giống nên khác biệt rất nhiều phụ thuộc vào thuật toán của PRNG. – Joey

+0

Nó ngụ ý rằng đầu ra không cần phải không thể dự đoán được, nhưng đó cũng giả định người hỏi câu hỏi thực sự nhận ra rằng các máy tạo hạt giống tạo ra cùng một chuỗi các số. – Matt

+0

@Johannes: Tuyệt đối, nhưng nếu bạn thực sự muốn sản lượng không thể đoán trước thì bạn không muốn ai đó có thể đoán hạt giống. Vì vậy, vì lý do này, tốt nhất là hạt giống chính nó là hoàn toàn không thể đoán trước (ví dụ: từ/dev/ngẫu nhiên). –

0

Tùy thuộc vào ứng dụng bạn đang sử dụng PRNG. Nếu bạn đang sử dụng thứ gì đó cần phải có mật mã, thì các hạt thường cần phải cực kỳ khó để suy ra dựa trên đầu ra, khác nhau mỗi khi ứng dụng chạy, khó đoán và không thể xác định bằng kỹ thuật đảo ngược ứng dụng (nghĩa là chúng không thể được mã hóa cứng).

Nếu mục tiêu của bạn là trò chơi, các yêu cầu của bạn có thể khác. Ví dụ: nếu bạn đang kiểm soát chiến lược máy tính, nhưng chiến lược của máy tính vẫn giữ nguyên cho tất cả các lần chạy trò chơi, bạn có thể có một trò chơi dễ dàng đánh bại. Sau đó, một lần nữa, bạn có thể muốn cho chế độ "dễ dàng".

+1

Nếu điều này có liên quan đến mật mã, thì MT19937 là một máy phát điện rất sai để bắt đầu. – Joey

1

Bạn dường như muốn các số giả ngẫu nhiên không giả ngẫu nhiên, với xác suất cao hơn các số liên tiếp là 'đáng kể' khác với yêu cầu giả ngẫu nhiên. Tôi nghi ngờ rằng bất kỳ prng chung nào sẽ làm điều này, bất kể chiến lược gieo giống của bạn là gì.

4

Nếu trình tạo số ngẫu nhiên của bạn có chất lượng cao, nó không quan trọng bạn gieo hạt như thế nào. Thực tế, cách tốt nhất là gieo hạt giống một lần.Trình tạo số ngẫu nhiên được thiết kế để có hành vi thống kê nhất định khi chúng được bắt đầu. Thường xuyên nhập lại một cách hiệu quả tạo ra một trình tạo số ngẫu nhiên khác nhau, cái mà có thể không tốt.

Chọn ngẫu nhiên các hạt giống giống như ý tưởng hay, nhưng không phải. Thực tế, vì "nghịch lý sinh nhật", có khả năng cao đáng ngạc nhiên là bạn sẽ chọn cùng một hạt giống hai lần.

Các vấn đề liên quan