2011-12-07 35 views
6

thể trùng lặp:
Python's random: What happens if I don't use seed(someValue)?Seed() và số ngẫu nhiên bằng Python

Hôm nay, tôi chỉ nói về seed() chức năng từ một lập trình viên nhiều kinh nghiệm hơn tôi. Tôi thường chỉ gọi choice() với một danh sách như một đối số, vì tôi không cần thêm chức năng số ngẫu nhiên nữa.

Người bạn lập trình của tôi nói với tôi rằng việc gọi hạt giống là cần thiết vì nếu không Python luôn bắt đầu các phép toán số ngẫu nhiên bằng 0 làm hạt mặc định. Điều này có nghĩa rằng mặc dù các con số xuất hiện ngẫu nhiên, chúng tôi thực sự nhận được cùng một trình tự mỗi lần.

Điều này khiến tôi khá kỳ quặc. Ví dụ, hàm choice() có thực sự không gọi hạt giống trước khi nó hoạt động không? Hoặc là lý do nó không thể thay đổi hạt giống của nó bằng cách lập trình bởi vì nó sẽ liên quan đến việc chọn một số ngẫu nhiên, và rõ ràng rằng nó là một vấn đề nếu mục tiêu cuối cùng của chúng ta cũng là chọn một số ngẫu nhiên!

Tôi đang ranting một chút ở đây, nhưng tôi tự hỏi nếu có ai có ý tưởng rõ ràng về cách tất cả điều này được thực hiện.

+2

Đây là tất cả những điều bạn có thể tìm hiểu trong tài liệu (http://docs.python.org/library/random.html) hoặc bằng cách tự mình thử nghiệm trong trình thông dịch. Thử chạy Python và thực hiện 'random.choice (range (1000))' hai lần. Bạn có nhận được câu trả lời giống nhau không? –

+0

@MichaelHoffman bạn đã bỏ lỡ điểm. Tất nhiên bạn sẽ không nhận được câu trả lời tương tự bằng cách thực hiện nó hai lần trong cùng một quy trình Python. Bài kiểm tra chính xác là để mở hai quy trình và thử nó trong mỗi quy trình. –

+0

Tôi đã viết rằng kém. Tôi có nghĩa là toàn bộ hoạt động (chạy Python và thực hiện chức năng) nên được thực hiện hai lần. –

Trả lời

28

người bạn của bạn là sai lầm chết người, và sẽ biết vì vậy nếu anh đọc tài liệu cho seed() chức năng:

Khởi tạo bộ tạo số ngẫu nhiên cơ bản. Đối số tùy chọn x có thể là bất kỳ đối tượng có thể băm nào. Nếu x bị bỏ qua hoặc Không, thời gian hệ thống hiện tại được sử dụng; thời gian hệ thống hiện tại cũng được sử dụng để khởi tạo trình tạo khi mô-đun được nhập lần đầu tiên. Nếu các nguồn ngẫu nhiên được cung cấp bởi hệ điều hành, chúng được sử dụng thay cho thời gian hệ thống (xem hàm os.urandom() để biết chi tiết về tính khả dụng).

(tôi nhấn mạnh).

Hắn đoán dựa trên kiến ​​thức của mình về cách hoạt động bằng các ngôn ngữ khác. Chức năng seed() được cung cấp chủ yếu để bạn có thể nhận được số dòng giả ngẫu nhiên (điều này là cần thiết cho một số ứng dụng cụ thể).

Các chức năng bạn gọi trực tiếp từ mô-đun random thực sự là bí danh đối với các phương thức của một phiên bản ẩn của lớp random.Random. Mỗi trường hợp, ít nhất là có hiệu lực, gọi seed() trong số __init__().

Chức năng choice() rõ ràng không gọi seed() trước khi hoạt động, bởi vì điều đó có nghĩa là tái gieo hạt trước mọi lựa chọn, điều này sẽ đánh bại mục đích của việc gieo hạt.

+0

Cảm ơn câu trả lời của bạn. –