2009-05-26 40 views
11

Số ngẫu nhiên được tạo ra như thế nào? Làm thế nào để các ngôn ngữ như java vv tạo ra các số ngẫu nhiên, đặc biệt là làm thế nào nó được thực hiện cho GUIDs. tôi thấy rằng các thuật toán như máy phát điện Pseudorandomnumber sử dụng các giá trị ban đầu.Cách tạo số "ngẫu nhiên" nhưng cũng "duy nhất"?

Nhưng tôi cần tạo một chương trình số ngẫu nhiên, trong đó một số lần xuất hiện không bao giờ lặp lại ngay cả khi hệ thống được khởi động lại. Tôi nghĩ rằng tôi cần lưu trữ các giá trị ở bất kỳ đâu để tôi có thể kiểm tra xem số có lặp lại không hay không, nhưng nó sẽ quá phức tạp khi danh sách vượt quá giới hạn.?

+2

Bạn có muốn tạo trình tạo GUID không? Nếu có, vui lòng cung cấp ngôn ngữ và hệ điều hành bạn đang làm việc. Chúng tôi sẽ cho bạn biết cách sử dụng thư viện GUID cho nền tảng của bạn. –

+0

Nhân bản (gần như) của http://stackoverflow.com/questions/506118/how-to-manually-generate-random-numbers –

+0

@ S.Lott: ya. Tôi đang sử dụng VS2005 trong Windows xp và C#. @ Binary Worrier: xin lỗi vì tôi không tìm thấy câu hỏi stackoverflow khi đăng bài này. – SyncMaster

Trả lời

18

Đầu tiên: Nếu số được đảm bảo không bao giờ lặp lại, nó không phải là rất ngẫu nhiên.

Thứ hai: Có rất nhiều PRNG algorithms.

UPDATE:

Thứ ba: Có một IETF RFC for UUIDs (những gì MS gọi GUID), nhưng bạn nên nhận ra rằng (U | G) UID là không mã hóa an toàn, nếu đó là một mối quan tâm dành cho bạn.

UPDATE 2:

Nếu bạn muốn thực sự sử dụng một cái gì đó như thế này trong mã sản xuất (không chỉ cho sự soi sáng của riêng bạn) xin sử dụng một thư viện tồn tại trước đó. Đây là loại mã được bảo đảm gần như có lỗi nhỏ trong đó nếu bạn chưa bao giờ thực hiện nó trước đó (hoặc thậm chí nếu bạn có).

UPDATE 3:

Đây là docs for .NET's GUID

+0

+1: Tôi tin rằng đó là tất cả các cơ sở được bảo hiểm, nếu điều này không trả lời câu hỏi như được hỏi, sẽ không có gì :) –

+0

Điều thú vị là, vì LCG (http://en.wikipedia.org/wiki/Linear_congruential_generator) là chỉ được gieo mầm bởi giá trị trước đó, nó sẽ tạo ra một chuỗi không lặp lại. Đó là, sẽ không có lặp lại cho đến khi toàn bộ trình tự lặp lại. – Sionide21

+1

Một RNG chắc chắn có thể ngẫu nhiên nếu nó không lặp lại chính nó. Điều này chỉ đòi hỏi nó có cơ hội bình đẳng để chọn bất kỳ số nào không được chọn cho đến nay. – MSalters

0

Hầu hết các trình tạo số ngẫu nhiên có cách "ngẫu nhiên" reïnitialize giá trị hạt giống. (Đôi khi được gọi là ngẫu nhiên).

Nếu không thể, bạn cũng có thể sử dụng đồng hồ hệ thống để khởi tạo hạt giống.

+1

đồng hồ hệ thống là một ý tưởng tồi. nếu bạn đang chạy một trang web poker tôi có thể sử dụng thử và lỗi và rất dễ dàng làm việc ra hạt giống của bạn dựa trên vài thẻ trong quá khứ và đoán sự khác biệt thời gian giữa các đồng hồ của chúng tôi. – SillyMonkey

3

Có rất nhiều cách để bạn có thể tạo ra số ngẫu nhiên. Nó thường được thực hiện với một cuộc gọi hệ thống/thư viện trong đó sử dụng một máy phát số giả với một hạt giống như bạn đã mô tả.

Nhưng, có nhiều cách khác để nhận số ngẫu nhiên liên quan đến phần cứng chuyên dụng để nhận được số ngẫu nhiên TRUE. Tôi biết một số số poker sites sử dụng loại phần cứng này. Nó rất thú vị để đọc cách họ làm điều đó.

+0

Có lẽ điều này dựa trên việc xem các hạt phân hủy? Chết tiệt, có nửa giờ tiếp theo của tôi. – annakata

+0

heheheheheheheheheheheeh –

+1

Nó có thể được thực hiện bằng cách sử dụng một số diode giữ gần đầu gối của nó (là thuật ngữ bằng tiếng Anh?), Nơi nó rất không ổn định và ngẫu nhiên có thể chuyển đổi từ đi qua hiện tại để không vượt qua hiện tại. –

0

Cụ thể về Java:

  • java.util.Random sử dụng một linear congruential generator, đó là not very good
  • java.util.UUID#randomUUID() sử dụng java.security.SecureRandom, một giao diện cho một loạt các RNGs mã hóa an toàn - mặc định dựa trên SHA-1, tôi tin rằng .
  • UUIDs/GUIDs không nhất thiết phải ngẫu nhiên
  • Thật dễ dàng để tìm thấy hiện thực của RNGs trên mạng mà là tốt hơn nhiều so java.util.Random, chẳng hạn như Mersenne Twister hoặc multiply-with-carry
0

Tôi hiểu rằng bạn đang tìm kiếm một cách để tạo ra số ngẫu nhiên bằng C#. Nếu có, RNGCryptoServiceProvider là những gì bạn đang tìm kiếm.

[EDIT]

Nếu bạn tạo ra một số lượng khá dài byte sử dụng RNGCryptoServiceProvider, nó có khả năng là độc đáo nhưng không có bảo lãnh. Theo lý thuyết, các số ngẫu nhiên thực không có nghĩa là duy nhất. Bạn lăn một con xúc xắc 2 lần và bạn có thể bị đầu cả hai lần nhưng chúng vẫn ngẫu nhiên. TRUE RANDOM!

Tôi đoán để áp dụng kiểm tra là duy nhất, bạn chỉ cần triển khai cơ chế lưu giữ lịch sử của các số đã tạo trước đó.

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