Làm thế nào để tạo số ngẫu nhiên làm việc?


23

Tôi chỉ đang suy nghĩ về rand()chức năng php và suy nghĩ về cách tôi có thể làm lại nó, và tôi đã hoàn toàn choáng váng.

Làm thế nào để tạo số ngẫu nhiên làm việc?


2
Các bộ tạo số ngẫu nhiên giả sử dụng một hạt giống, một bảng các hằng số được xác định trước và các công thức toán học. Máy phát số ngẫu nhiên thực thường sử dụng tiếng ồn trong khí quyển. Bạn có thể dễ dàng nhận được các số ngẫu nhiên từ việc đọc / dev / ngẫu nhiên.
đúng vào

Là tiếng ồn trong khí quyển được đảm bảo là ngẫu nhiên?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil

3
Ai đó phải làm điều này: xkcd.com/221 ;)
Valera Kolupaev

Câu trả lời:


7

Công cụ tạo số ngẫu nhiên (RNG) đang thực sự tạo ra số giả ngẫu nhiên, vì thực tế không thể tạo ra số ngẫu nhiên THẬT. Những điều thực sự ngẫu nhiên thực sự duy nhất là hành động của Thiên Chúa, như sét.

Bài viết trên wikipedia này có thể giúp bạn giải thích: http://en.wikipedia.org/wiki/Random_number_generators


Theo những gì tôi hiểu, về cơ bản có hai phần của một RNG: hạt giống, và sau đó là số ngẫu nhiên được chọn từ hạt giống đó. Khi bạn gieo RNG, bạn sẽ cho nó tương đương với điểm bắt đầu. Điểm bắt đầu sau đó có một loạt các số "bên trong" của nó mà chương trình chọn từ đó. Trong PHP, bạn có thể sử dụng srand () để "xáo trộn" các hạt giống, do đó bạn hầu như luôn nhận được một câu trả lời khác nhau. Sau đó, bạn có thể sử dụng rand (min, max) để đi vào hạt giống và chọn một số giữa min và max, bao gồm.


CẢNH BÁO, POSSIBLE CHEESY ANALOGY AARKAD!

Hãy nghĩ về mỗi "hạt giống" như một cái rương băng, và sau đó là những con số ngẫu nhiên như những khối băng. Giả sử bạn có 1000 rương đá và mỗi rương có 1000 rương đá bên trong. Tại hội chợ hạt, họ sẽ chọn một thùng đá để bắt đầu sử dụng cho đồ uống và họ chỉ có thể sử dụng một viên đá. Tuy nhiên, họ chỉ cần những khối băng lớn hơn 1 inch. Vì vậy, họ sẽ chọn một rương ngẫu nhiên giữa 1000 rương đó, và sau đó họ sẽ chọn một khối băng bên trong rương đó một cách ngẫu nhiên. Nếu nó hoạt động cho kích thước họ muốn, họ sử dụng nó. Nếu không, họ đặt nó trở lại trong rương với những người khác. Nếu họ muốn làm cho nó vui hơn một chút, họ sẽ thay rương trước cho sự lãng quên hoàn toàn, nếu bạn muốn!

Về cách PHP thực sự chọn hạt giống và số ngẫu nhiên, tôi không có đủ kiến ​​thức cho điều đó (có lẽ là điều bạn đang tự hỏi nhiều nhất về!). Tôi sẽ không thử và làm lại hàm rand (); đối với hầu hết các ứng dụng dựa trên web mà bạn sẽ tạo, rand () sẽ đủ cho bất kỳ số ngẫu nhiên nào bạn cần.

Ngoài ra, hãy kiểm tra các trình tạo cộng hưởng tuyến tính, đây có thể là nhiều hơn những gì bạn đang tìm kiếm nếu bạn muốn các chi tiết bẩn: http://en.wikipedia.org/wiki/Linear_congruential_generator

Hi vọng điêu nay co ich!


7
Làm thế nào sẽ hành động godngẫu nhiên trong ít nhất? Trên hết, sét cũng không ngẫu nhiên, nó đi theo một con đường được xác định bởi các điều kiện khác nhau. Ngoài ra, trình thông dịch tạo ra số này về cơ bản là không liên quan.

7
Tôi đang sử dụng các hành vi của Thiên Chúa theo nghĩa pháp lý: en.wikipedia.org/wiki/Act_of_God Chúng được coi là ngẫu nhiên vì chúng nằm ngoài tầm kiểm soát của con người.

4
Vì vậy, về cơ bản, không có gì là ngẫu nhiên. Nhưng điều đó đòi hỏi mọi sự xuất hiện dường như ngẫu nhiên đều bị ảnh hưởng, điều này không có tác dụng khi bạn bắt đầu thời gian .... Có vẻ như tôi sẽ tham gia một số lớp triết học = D

6
@Korvin, theo như chúng ta biết, các hiện tượng lượng tử như phân rã phóng xạ, hoặc sự phát xạ của một photon bởi một nguyên tử bị kích thích thực sự là ngẫu nhiên. Tuy nhiên, các nhà toán học và triết gia thực sự tranh luận về ý nghĩa thực sự của nó là ngẫu nhiên. Và trong khi những người bình thường nghĩ rằng việc tung đồng xu là khá ngẫu nhiên, thì các pháp sư giai đoạn nhanh nhẹn ( news.stanford.edu/pr/2004/diaconis-69.html ) có thể thường xuyên nhận được 10 đầu trên 10 lần lật.
Charles E. Grant

1
@Charles - Việc tung đồng xu thậm chí không phải là đầu / đuôi nhị phân, nó thực sự là đầu / đuôi / cạnh, do đó, một ảo thuật gia thực sự giỏi có thể khiến nó rơi xuống không phải đầu cũng không đuôi. * 8 ')
Đánh dấu gian hàng

18

Chúng thường không thực sự ngẫu nhiên, nhưng được gọi là giả ngẫu nhiên vì chúng tạo ra một chuỗi số xuất hiện ngẫu nhiên. Điều này được thực hiện với một số công thức toán học thú vị. Một trong những phổ biến nhất là Máy phát đồng tuyến tính .

Các số giả ngẫu nhiên có một thuộc tính hữu ích mà các số ngẫu nhiên thực sự không có: nếu bạn sử dụng cùng một hạt giống khi bạn bắt đầu, bạn sẽ nhận lại một chuỗi giống hệt nhau. Điều này có thể rất thuận tiện để thử nghiệm.


Nếu tôi hiểu chính xác câu nói thứ hai của bạn: random(5332)sẽ luôn bằng random(5332)?

2
@Korvin, không, ý tôi là nếu bạn gọi srand(5332)thì số tiếp theo được trả về randsẽ luôn giống nhau.
Đánh dấu tiền chuộc

3
"Xuất hiện ngẫu nhiên" -> có cùng thuộc tính thống kê với các số thực sự ngẫu nhiên.

+1 cho liên kết Wikipedia LGC, điều này có một hình ảnh động tuyệt vời về lý do tại sao các PRNG đơn giản có những hạn chế nghiêm trọng khi thực hiện mô phỏng Monte-carlo đa chiều.
Đánh dấu gian hàng

4

Bạn đang yêu cầu Pseudorandom hoặc Random? Những người khác trả lời về giả danh, hãy để tôi nói về Ngẫu nhiên.

Đã có (là?) Máy tạo số ngẫu nhiên dựa trên phần cứng thực tế được bán. Họ đã dựa trên một con chip với một đài phát thanh nhỏ đo tiếng ồn trắng của bức xạ không gian sâu hoặc một mẫu phóng xạ nhỏ và các khoảng thời gian đo giữa sự phân rã của nó. Vấn đề với họ là băng thông - lượng entropy mà họ có thể tạo ra không cao lắm nên chúng được sử dụng cho các thuật toán giả ngẫu nhiên. Chúng được sử dụng trong các hệ thống ngân hàng, bảo mật cao và thích.

OTOH, nếu bạn gặp bất kỳ nhà phát triển hệ thống nhúng nào, họ sẽ cười nhạo những điều này. Đối với các mục đích phổ biến trong lập trình vi điều khiển, việc đọc 4 bit thấp của bất kỳ Bộ chuyển đổi tương tự kỹ thuật số 16 bit nào, sử dụng chân nổi (không được kết nối) sẽ tạo ra tiếng ồn ngẫu nhiên hoàn toàn tốt, ở băng thông đủ lớn (thời gian bỏ phiếu càng ngắn " ồn ào "việc đọc) và dễ dàng hơn so với việc viết thói quen RNG thực tế. Và xem xét các ADC thường được tìm thấy được triển khai trong silicon của vi điều khiển, thường được triển khai và thường được triển khai với 8 kênh mà bạn cần có thể 5 cho ứng dụng của mình, thực tế là miễn phí.

Và ngay cả khi bạn không có ADC, một vài yếu tố được kết nối với pin GPIO kỹ thuật số sẽ tạo ra tiếng ồn khá tốt. Trong nhúng, tiếng ồn là hiện tại (và liên tục chiến đấu), và do đó, có được một số ngẫu nhiên thực sự là rất dễ dàng.


2

Có nhiều cách để cố gắng mô phỏng một chuỗi số "ngẫu nhiên". Điểm dừng đầu tiên của bạn là đọc về các máy phát đồng quy tuyến tính , chắc chắn. Đây là cách mà hầu hết các trình tạo số ngẫu nhiên cơ bản hoạt động và tôi cá là đó là cách hàm rand () của PHP hoạt động.

Câu hỏi tiếp theo thú vị hơn để suy ngẫm là làm thế nào để nó tự gieo hạt giống? thời gian? Địa chỉ IP? v.v.


Hạt giống là điều khiến tôi bối rối, tôi không thể nghĩ ra bất cứ thứ gì có thể gieo mầm hàm mà không có kiểu mẫu nào đó, và ngay cả khi không, thì điều gì khiến hạt giống ngẫu nhiên được tạo ra ngay từ đầu!

3
Tôi tin rằng dấu thời gian thường được sử dụng làm hạt giống ban đầu khi không thực sự được cung cấp từ một số nguồn khác. Trong BASIC cũ, RANDOMIZE TIMERlà một thành ngữ phổ biến và "đủ tốt" cho hầu hết các mục đích (không mã hóa). Theo man 3 srand , thư viện GNU C sử dụng hạt giống cố định là 1 cho đến khi PRNG được đặt lại.
một CVn

1

Trước hết, hầu như tất cả các rand()hàm không cung cấp tính ngẫu nhiên thực sự, thay vào đó chúng cung cấp cái gọi là số giả ngẫu nhiên.

Vì vậy, làm thế nào để tạo số giả ngẫu nhiên làm việc? Về cơ bản giống như cách mã hóa hoạt động: Bạn có một hàm (hàm băm) nhận một số đầu vào và tạo ra một số đầu ra theo cách phức tạp đến mức không thể từ đầu ra để đoán đầu vào hoặc ngược lại. Đó là, mỗi cypher có thể được sử dụng để tạo ra một trình tạo giả ngẫu nhiên khá tốt. Tuy nhiên, mặc dù bạn có thể sử dụng bất kỳ trình tạo giả ngẫu nhiên nào để thực hiện mã hóa theo nguyên tắc, hầu hết các trình tạo số giả ngẫu nhiên chủ yếu được phát triển cho tốc độ, không phải bảo mật bằng mật mã, vì vậy chúng sẽ không khiến tin tặc đau đầu.

Đối với trình tạo ngẫu nhiên giả, hàm băm được áp dụng cho một số trạng thái bên trong ẩn của trình tạo và đầu ra của nó được sử dụng để a) sửa đổi trạng thái bên trong đó và b) để tính toán đầu ra của rand()hàm. Việc gọi tiếp theo rand()sẽ sử dụng trạng thái nội bộ đã thay đổi đó và do đó tạo ra một kết quả khác. Hàm băm càng tốt, kết quả càng dễ phân biệt với các số ngẫu nhiên thực sự.


Như một vấn đề thực tế, ngày nay máy tính có quyền truy cập vào các số ngẫu nhiên thực sự: Chúng xuất phát từ sự biến động trong thời gian của các ngắt được tạo ra bởi các thiết bị bên ngoài. Linux sử dụng các giá trị không chắc chắn nhỏ này để liên tục khuấy động một "nhóm entropy", chỉ là một vài kilobyte trạng thái bên trong. Băm mật mã dựa trên nhóm entropy này được cung cấp thông qua /dev/random/dev/urandomcác thiết bị. Vì vậy, truy cập vào một số số ngẫu nhiên thực sự tốt cũng đơn giản như mở một trong hai thiết bị này và đọc một số byte từ chúng.


-2

Số ngẫu nhiên là số được tạo bởi quá trình có đầu ra không thể đoán trước. tức là chúng ta không thể biết điều gì sẽ là đầu ra tiếp theo. Chúng ta có thể lấy một số ví dụ đơn giản về kết quả của súc sắc. Điều gì sẽ là đầu ra khi chúng ta ném xúc xắc là không thể đoán trước.

Có hai loại Số ngẫu nhiên 1. Số ngẫu nhiên thật 2. Số ngẫu nhiên giả.

Làm thế nào số ngẫu nhiên được di truyền


1
Vui lòng sử dụng định dạng trích dẫn để làm nổi bật phần nào của câu trả lời là của bạn và phần nào từ nguồn bạn trích dẫn. Nếu tất cả câu trả lời của bạn là một bản sao / dán từ nguồn bên ngoài, thì đó không phải là một câu trả lời hay ở đây.
Mat

điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 6 câu trả lời trước
gnat
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.