đặt chương trình hạt giống ngẫu nhiên trên toàn thế giới trong python


82

Tôi có một chương trình khá lớn, nơi tôi sử dụng các chức năng từ randommô-đun trong các tệp khác nhau. Tôi muốn có thể đặt hạt giống ngẫu nhiên một lần, tại một nơi, để chương trình luôn trả về kết quả giống nhau. Điều đó thậm chí có thể đạt được trong python?

Câu trả lời:


116

Mô-đun python chính được chạy nên import randomvà gọi random.seed(n)- mô-đun này được chia sẻ giữa tất cả các lần nhập khác randommiễn là ở nơi khác không đặt lại hạt giống.


3
Tôi có thể đặt lại hạt giống ở đâu đó mà không biết không? vì thiết lập các hạt giống lần trong tệp chính, không làm các trick
Mischa Obrecht

1
@MischaObrecht Tôi đoán vậy - hạt giống chỉ được khởi tạo trong lần nhập đầu tiên của mô-đun ngẫu nhiên - nếu nó được nhập nhiều lần, nó sẽ không thực hiện khởi tạo và đặt lại hạt giống - vì vậy phải có một lệnh gọi rõ ràng ở đâu đó trong mã của bạn
Jon Clements

3
Nếu bạn đang gọi các phương thức từ randomtrong mã cấp mô-đun, mà bạn đang nhập vào chính, trước khi random.seed(n)vào chính, thì các lệnh gọi đó sẽ được thực hiện trước hạt giống và do đó sẽ được phân tích theo thời gian và hiệu quả không thể tái tạo ngẫu nhiên.
Russell Borogove

12
Nếu hóa ra một số mã của bên thứ ba đang gửi lại RNG (không chắc nhưng có thể), hãy lưu ý rằng bạn có thể tạo thêm các bộ tạo số ngẫu nhiên với trạng thái độc lập thông qua hàm random.Random()tạo và sử dụng chúng khi khả năng tái tạo nghiêm ngặt là quan trọng.
Russell Borogove

Điều này không làm việc cho tôi. Và tôi không có mã có thể tái tạo. Tôi đoán mình sẽ phải kiểm tra tài liệu của tất cả các thư viện đã nhập ... (xem stackoverflow.com/questions/37886997/…
B Furtado

36

Nhận xét của zss nên được đánh dấu như một câu trả lời thực tế:

Một điều khác mà mọi người nên cẩn thận: nếu bạn đang sử dụng numpy.random, thì bạn cần phải sử dụng numpy.random.seed()để đặt hạt giống. Việc sử dụng random.seed()sẽ không đặt hạt giống cho các số ngẫu nhiên được tạo từ numpy.random. Điều này khiến tôi bối rối trong một thời gian. -zss


Hoàn toàn đúng, Nếu ở đâu đó trong ứng dụng của bạn, bạn đang sử dụng các số ngẫu nhiên từ hàm random module, hãy nói random.choices()và sau đó xuống sâu hơn tại một số điểm khác của trình numpytạo số ngẫu nhiên, giả sử np.random.normal()bạn phải đặt hạt giống cho cả hai mô-đun. Những gì tôi thường làm là có một vài dòng main.pygiống như random.seed(my_seed)np.random.seed(my_seed). Kudos để zss
Aenaon

Sage cũng gặp vấn đề tương tự, vì PRNG của nó khác với cả Python và numpy. Sử dụng set_random_seed()cho Sage.
Brent Baccala

8

Khi bắt đầu cuộc gọi ứng dụng của bạn, random.seed(x)hãy đảm bảo rằng x luôn giống nhau. Điều này sẽ đảm bảo chuỗi các số ngẫu nhiên giả sẽ giống nhau trong mỗi lần chạy ứng dụng.


3

Jon Clements trả lời khá nhiều câu hỏi của tôi. Tuy nhiên, đó không phải là vấn đề thực sự: Hóa ra, lý do cho sự ngẫu nhiên của mã của tôi là SVD numpy.linalg vì nó không phải lúc nào cũng tạo ra kết quả giống nhau cho các ma trận có điều kiện xấu !!

Vì vậy, hãy chắc chắn kiểm tra điều đó trong mã của bạn, nếu bạn gặp vấn đề tương tự!


22
Một điều khác mà mọi người nên cẩn thận: nếu bạn đang sử dụng numpy.random, thì bạn cần sử dụng numpy.random.seed () để đặt hạt giống. Sử dụng random.seed () sẽ không đặt hạt giống cho các số ngẫu nhiên được tạo từ numpy.random. Điều này khiến tôi bối rối trong một thời gian.
zss

1

Xây dựng dựa trên các câu trả lời trước đó: lưu ý rằng nhiều cấu trúc có thể khác nhau giữa các đường dẫn thực thi, ngay cả khi tất cả các hạt giống được kiểm soát.

Tôi đã nghĩ " tôi đã đặt các hạt giống của mình để chúng luôn giống nhau và tôi không có sự thay đổi / phụ thuộc bên ngoài, do đó đường dẫn thực thi mã của tôi phải luôn giống nhau ", nhưng điều đó đã sai.

Ví dụ mà tôi bit list(set(...)), nơi thứ tự kết quả có thể khác nhau.


Điểm tốt, điều này đã đốt cháy tôi trước đây. Ngoài ra, những thứ như nhận kết quả từ db, những thứ đó cũng trả về không theo thứ tự (ngẫu nhiên) trừ khi bạn chỉ định khác
Justin Furuness

-14

Bạn có thể đảm bảo điều này khá dễ dàng bằng cách sử dụng trình tạo số ngẫu nhiên của riêng bạn.

Chỉ cần chọn ba số nguyên tố lớn nhất (giả sử đây không phải là một ứng dụng mật mã) và cắm chúng vào a, b và c: a = ((a * b)% c) Điều này cung cấp một hệ thống phản hồi tạo ra dữ liệu khá ngẫu nhiên. Lưu ý rằng không phải tất cả các số nguyên tố đều hoạt động tốt như nhau, nhưng nếu bạn chỉ đang thực hiện một mô phỏng, thì điều đó không thành vấn đề - tất cả những gì bạn thực sự cần cho hầu hết các mô phỏng là một mớ hỗn độn các số với một mẫu (giả ngẫu nhiên, hãy nhớ) đủ phức tạp nó không khớp theo một cách nào đó với ứng dụng của bạn.

Knuth nói về điều này.


10
Việc cuộn của riêng bạn là không cần thiết, bởi vì Python có các tiện ích số ngẫu nhiên tuyệt vời trong thư viện tiêu chuẩn của nó và rất dễ dàng tạo ra một trình tạo thực sự tồi nếu bạn không biết mình đang làm gì.
Russell Borogove

6
Tôi đồng ý rằng đó là một giải pháp khá tệ: Trong mô phỏng Monte Carlo (đó là chương trình của tôi), nơi người ta thường thu thập hàng triệu mẫu, các số ngẫu nhiên tương quan (bắt nguồn từ một bộ tạo không tốt) có thể dễ dàng làm sai lệch kết quả của bạn !!
Mischa Obrecht

Ý bạn là, Knuth luôn nói về điều này? Ngay cả bây giờ?
có nghĩa là có nghĩa là
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.