Tại sao không thể tạo ra các số thực sự ngẫu nhiên?


47

Tôi đã cố gắng giải quyết một vấn đề sở thích đòi hỏi phải tạo ra một triệu số ngẫu nhiên. Nhưng tôi nhanh chóng nhận ra, việc biến chúng trở nên độc đáo trở nên khó khăn. Tôi chọn Hướng dẫn thiết kế thuật toán để đọc về việc tạo số ngẫu nhiên.

Nó có đoạn văn sau mà tôi hoàn toàn không thể hiểu được.

Thật không may, việc tạo số ngẫu nhiên trông dễ dàng hơn nhiều so với thực tế. Thật vậy, về cơ bản là không thể tạo ra các số thực sự ngẫu nhiên trên bất kỳ thiết bị xác định nào. Von Neumann [Neu63] đã nói điều đó tốt nhất: Người bất cứ ai xem xét các phương pháp tạo ra các chữ số ngẫu nhiên, tất nhiên, ở trạng thái tội lỗi. Một cách tốt nhất chúng ta có thể hy vọng là các số giả ngẫu nhiên, một dòng số xuất hiện dưới dạng nếu chúng được tạo ngẫu nhiên.

Tại sao không thể tạo ra các số thực sự ngẫu nhiên trong bất kỳ thiết bị xác định nào? Câu văn này có nghĩa là gì?


86
Bạn có thực sự hỏi tại sao bạn không thể tạo ra số thực sự ngẫu nhiên trên một thiết bị xác định ? Không phải câu hỏi đã bao gồm câu trả lời?
Herby

37
Nếu tất cả các số bạn tạo phải là duy nhất, chúng không thực sự ngẫu nhiên. Hoàn toàn có khả năng một trình tạo số ngẫu nhiên thực sự sẽ cho kết quả tương tự mười lần liên tiếp.
TMN

28
Có một lỗ hổng trong việc tìm kiếm các số ngẫu nhiênduy nhất . Nếu bạn kết hợp các số là duy nhất , thì chúng không phải là ngẫu nhiên vì ngẫu nhiên đòi hỏi khả năng lặp lại cho dù có khả thi đến đâu.
Đánh dấu gian hàng

13
Bên ngoài máy tính, có bất kỳ số ngẫu nhiên nào thực sự ngẫu nhiên? Ném một cái chết, đó là vật lý chỉ với rất nhiều vectơ.
MPelletier

9
@MPelletier: Không hẳn. Cơ học lượng tử có thể (một khi các nhà khoa học đã tìm ra nhiều hơn về nó) ngụ ý sự tồn tại của tính ngẫu nhiên thực sự, tùy thuộc vào định nghĩa của bạn về tính ngẫu nhiên.
Brian

Câu trả lời:


65

Người ta nên tìm kiếm một trình tạo số giả ngẫu nhiên an toàn bằng mật mã . Hầu hết PRNG là các trình tạo đồng quy tuyến tính (cũng next numberlà một hàm tuyến tính previous number), vì vậy nếu bạn vẽ sơ đồ next numbervs previous numberbạn sẽ nhận được một biểu đồ các đường song song. Một CSPRNG sẽ không làm điều đó. Sự đánh đổi là họ chậm.

Tôi nhóm các trình tạo số ngẫu nhiên thành 3 loại :

  1. Đủ tốt để làm bài tập
  2. Đủ tốt để đặt cược công ty của bạn vào.
  3. Đủ tốt để đặt cược đất nước của bạn vào.

Tại sao không thể tạo ra các số thực sự ngẫu nhiên trong bất kỳ thiết bị xác định nào?

Một thiết bị xác định sẽ luôn tạo ra cùng một đầu ra khi được cung cấp cùng điều kiện bắt đầu và đầu vào - đó là ý nghĩa của nó deterministic. "Số ngẫu nhiên thực sự" là một quan điểm triết học, vì ý nghĩa của nó randomlà mấu chốt của cái nhìn rốn triết học (mọi người thậm chí không chắc chắn nếu phân rã nguyên tử là ngẫu nhiên hay theo một mô hình nào đó mà chúng ta không thể hiểu được chưa). Một trình tạo số ngẫu nhiên an toàn bằng mật mã sẽ lấy một số nguồn entropy bên ngoài để làm cho thiết bị không xác định.


1
Đó là lý do tại sao không thể có được một con số thực sự ngẫu nhiên. Ngay cả khi chuỗi không bao giờ lặp lại, không được đảm bảo cho các số ngẫu nhiên , Một lần chạy khác của chương trình có cùng đầu vào sẽ tạo ra kết quả tương tự. Vì vậy, người khác có thể sao chép số ngẫu nhiên của bạn sau đó, điều đó có nghĩa là nó hoàn toàn không ngẫu nhiên.
Spencer Rathbun

2
@ user973810 Vấn đề với định nghĩa đó từ lý thuyết thông tin là bạn không thể thể hiện một thể hiện thực tế của một chuỗi ngẫu nhiên. Chúng tôi có thể chứng minh, đối với bất kỳ ngôn ngữ định nghĩa hợp lý nào, hầu như mọi chuỗi vô hạn (theo nghĩa kỹ thuật) là ngẫu nhiên, bởi vì nó không thể được mô tả bằng ngôn ngữ này. Điều hữu ích hơn là khái niệm về một trình tạo trình tự ngẫu nhiên: không phải là một trình tạo ra một chuỗi ngẫu nhiên, mà là một trình tạo ngẫu nhiên một trình tự.
Gilles 'SO- ngừng trở nên xấu xa'

13
Nit nit nhẹ: một số người, cụ thể là các nhà vật lý hạt nhân và hạt, khá chắc chắn rằng các quá trình như phân rã nguyên tử thực sự ngẫu nhiên.
David Z

9
@David: Chúng ta có thể đi xa hơn một chút. Các thí nghiệm khác nhau về sự bất bình đẳng của Bell cho thấy rằng các quá trình lượng tử nhất định chắc chắn không thể đoán trước được . Chúng có thể là ngẫu nhiên theo một số ý nghĩa triết học hoặc chúng có thể phụ thuộc vào các biến ẩn không cục bộ, nhưng một trong hai trường hợp ngăn chặn dự đoán đáng tin cậy.
dmckee

7
@dmckee: yeah, tôi chỉ hình dung sẽ dễ dàng hơn để tránh giải thích mối liên hệ giữa bất bình đẳng của Bell và sự sụp đổ của sóng trong các bình luận về prog.SE. Mọi người luôn có thể đến trang web của chúng tôi nếu họ tò mò ;-) Tangurena: đúng, Einstein đã nói vậy, nhưng điều đó chỉ có nghĩa là anh ta thực sự muốn vũ trụ mang tính quyết định. Mặc dù không phải vậy. Các thí nghiệm được thực hiện sau cái chết của Einstein cho thấy khá thuyết phục (loại bỏ các biến ẩn không cục bộ, hay còn gọi là kỳ lạ ). Chỉ vì anh ấy Einstein không có nghĩa là anh ấy đúng về mọi thứ.
David Z

22

Sự ngẫu nhiên thực sự ngụ ý không thuyết phục. Nếu nó mang tính quyết định, nó có thể được dự đoán chính xác (đây là ý nghĩa của tính quyết định); nếu nó có thể được dự đoán, nó không phải là ngẫu nhiên.

Điều tốt nhất bạn có thể nhận được từ một trình tạo số giả ngẫu nhiên xác định là một chuỗi các số có chu kỳ rất dài (không lặp lại là không thể trừ khi thiết bị RNG của bạn có bộ nhớ không giới hạn), trong khoảng thời gian của chu kỳ, tạo ra một số luồng đáp ứng tất cả các thuộc tính khác của chuỗi ngẫu nhiên (phân phối đồng nhất các giá trị là giá trị thú vị nhất).

Để giải quyết vấn đề này, nhiều UNIX hiện đại và thích Unix có RNG kernel sử dụng các nguồn nhiễu vật lý để tạo ra sự ngẫu nhiên thực sự.

Một cách tiếp cận phổ biến khác là lấy thời gian hiện tại làm hạt giống cho RNG xác định (tính srand(time(NULL));bằng C); Nói một cách mật mã, điều này là vô giá trị, vì thời điểm hiện tại không có gì bí mật, nhưng đối với những thứ như mô phỏng vật lý hoặc trò chơi video, nó là đủ tốt.


Lưu ý rằng không lặp lại cũng là không thể đối với bất kỳ trình tạo nào có giá trị đầu ra giới hạn (số lượng bit giới hạn). Nhưng tất nhiên độ dài chu kỳ của một bộ tạo xác định có lẽ ngắn hơn nhiều so với mức tối đa theo lý thuyết là tất cả các hoán vị có thể có.
9000

@ 9000: Tất nhiên điều này không đúng. Lấy số lượng không hợp lý sử dụng các chữ số (bất kỳ cơ sở nào) làm chuỗi "ngẫu nhiên" của bạn. Bùng nổ! trình tự không lặp lại (theo định nghĩa) và vẫn còn giới hạn (với cơ sở của bạn).
ThePopMachine

@ThePopMachine: bạn có thể tạo một chuỗi bit không lặp lại có độ dài bất kỳ, tương đương với chuỗi không lặp lại của các số có độ dài không giới hạn. Bạn không thể tạo một chuỗi không lặp lại các số nguyên có độ lớn giới hạn (ví dụ 32 bit); khi bạn đã tạo tất cả các hoán vị của các giá trị 32 bit, một chuỗi phải lặp lại. Bạn đúng rồi; chúng ta chỉ nói về những điều khác nhau.
9000

@ 9000: Không chồn. Bạn đã thực hiện một tuyên bố chăn là sai. Nếu bạn thực sự chỉ đang cố gắng không có nhiều hơn n ^ k các chuỗi độ dài k khác nhau cho n giá trị khác nhau, và do đó nó phải lặp lại, thì điều này khá rõ ràng và không thú vị.
ThePopMachine

2
@ThePopMachine: Tôi sẽ đánh giá cao nếu bạn giảm bớt một chút. Để trích dẫn, «không lặp lại cũng không thể đối với bất kỳ trình tạo nào có giá trị đầu ra giới hạn (số lượng bit giới hạn)». Những gì bạn nói rõ ràng là một số bit không giới hạn, như một chuỗi các chữ số [nhị phân] của một số vô tỷ. Tuyên bố của bạn, trong khi sự thật, không liên quan đến vấn đề.
9000

10

Chương thứ hai của cuốn sách Mô phỏng sự kiện rời rạc: Khóa học đầu tiên của Lawrence Leemis giới thiệu tuyệt vời về các trình tạo số ngẫu nhiên (hay chính xác hơn là các trình tạo số ngẫu nhiên psuedo).

Một đoạn trích từ cuốn sách của ông giải thích nó tốt theo ý kiến ​​của tôi:

Trong lịch sử, ba loại trình tạo số ngẫu nhiên đã được ủng hộ cho các ứng dụng tính toán: (a) các trình tạo tra cứu bảng kiểu 1950, ví dụ như bảng tổng công ty RAND gồm một triệu chữ số ngẫu nhiên; (b) các máy phát phần cứng như, ví dụ, các thiết bị "nhiễu trắng" nhiệt; và (c) máy phát thuật toán (phần mềm). Trong ba loại này, chỉ có các trình tạo thuật toán đã đạt được sự chấp nhận rộng rãi. Lý do cho điều này là chỉ có các trình tạo thuật toán có khả năng đáp ứng tất cả các tiêu chí tạo số ngẫu nhiên thường được chấp nhận tốt sau đây. Một máy phát điện phải là:

  • ngẫu nhiên - có thể tạo ra đầu ra vượt qua tất cả các thử nghiệm thống kê hợp lý về tính ngẫu nhiên;
  • có thể kiểm soát - có thể tái tạo đầu ra của nó, nếu muốn;
  • di động - có thể tạo ra cùng một đầu ra trên nhiều hệ thống máy tính;
  • hiệu quả - nhanh chóng, với các yêu cầu tài nguyên máy tính tối thiểu;
  • tài liệu - phân tích lý thuyết và thử nghiệm rộng rãi.

Vì vậy, mặc dù có thể sử dụng một bộ tạo nhiễu trắng để có được các số ngẫu nhiên "tốt hơn", nhưng chúng không được chấp nhận vì chúng không tuân theo hầu hết các tiêu chí trên.

Tôi muốn khuyên bạn nên dùng một bản sao của cuốn sách đó (hoặc trên một cái gì đó tương tự). Hiểu chính xác cách thức hoạt động của PRNG chắc chắn sẽ hỗ trợ bạn trong nỗ lực của bạn.


7

Bởi vì bạn cần viết mã để tạo các số ngẫu nhiên và Mã KHÔNG phải là ngẫu nhiên. (Đó là quyết định)

Vì vậy, bạn bắt đầu với "Giá trị hạt giống" được chọn tại "Ngẫu nhiên" (thường là dấu thời gian hiện tại) sau đó sử dụng nó trong thuật toán để bắt đầu tạo số. Nhưng toàn bộ tập hợp dựa trên giá trị Seed ban đầu!

Vì vậy, nếu bạn chạy lại mã của mình với (các) giá trị Seed chính xác, bạn sẽ nhận được cùng một bộ số CHÍNH XÁC! Làm thế nào bất kỳ người hợp lý có thể gọi đó là ngẫu nhiên? Nhưng nó chắc chắn LOOK ngẫu nhiên.


Về việc làm cho chúng trở nên độc đáo, Sau khi tạo một số chỉ cần kiểm tra xem bạn đã có số đó chưa, nếu có, hãy vứt nó đi và tạo một số mới.


13
Về mặt tích cực, các số giả ngẫu nhiên lặp lại có thể rất tốt để gỡ lỗi.
David Thornley

5

Vì bạn đang tạo số ngẫu nhiên, bạn nên kỳ vọng các giá trị được tạo là không duy nhất. Đây là một tính chất của tính ngẫu nhiên - bạn không thể nói một chuỗi các số thực sự ngẫu nhiên (hoặc thậm chí giả ngẫu nhiên) là duy nhất, bởi vì yêu cầu đó sẽ cho phép dự đoán giá trị cuối cùng trong phạm vi, cũng như thay đổi xác suất của tất cả các số unchosen mỗi khi một số mới được chọn.


1
Đây thực sự là một nhận xét chứ không phải là một câu trả lời, vì nó không thực sự trả lời câu hỏi .
Đánh dấu gian hàng

5

Tôi có một định nghĩa rất đơn giản về Pseudo Random :

Quá nhiều biến số chưa biết để dự đoán.

Tôi cũng có một định nghĩa đơn giản về True Random :

Vô số biến không xác định.

Vấn đề với máy tính là nó luôn biết TẤT CẢ các biến. Số ngẫu nhiên chỉ đơn giản là một hàm toán học của một số giá trị hạt giống .
Điều tốt nhất chúng ta có thể làm là cung cấp cho máy tính một giá trị hạt giống ngẫu nhiên, thường dựa trên một biến mà chúng ta không thể dự đoán (như thời gian chính xác).

Mặc dù một máy tính hoàn toàn không thể tạo ra một số ngẫu nhiên, thật tốt khi giới thiệu quá nhiều biến số để dự đoán!


1
"Thời gian" là một ví dụ tồi tệ về những điều không thể dự đoán được. Mặt khác, sự di chuyển của chuột, đầu vào micrô, v.v. là những đầu vào không dự đoán được.
HoLyVieR

3

Việc tạo ra các số thực sự ngẫu nhiên trong phần mềm thực sự là không thể như những người khác đã chỉ ra, tuy nhiên với phần cứng có thể xây dựng một thiết bị có thể tạo ra các số thực sự ngẫu nhiên *. Có khá nhiều ví dụ về điều này trên internet, và có nhiều phương pháp được sử dụng, từ đọc thời gian giữa các con bọ ve trên quầy Geiger đến lấy mẫu tiếng ồn trắng (chủ yếu là bức xạ nền từ vũ trụ) của một máy thu không được xử lý. Bản thân tôi đã xây dựng một vài cách sử dụng một vài phương pháp có sẵn.

* Bất kỳ người đam mê vật lý giỏi nào cũng sẽ chỉ ra rằng theo cách mà vũ trụ vận hành thì không có gì trong số này là siêu kỹ thuật thực sự ngẫu nhiên nhưng không có cách nào hợp lý để dự đoán kết quả vì vậy vì lợi ích của cuộc thảo luận này, chúng có hiệu quả.


5
Là một người đam mê vật lý bán thời gian, các máy phát điện dựa trên các sự kiện lượng tử là (theo như chúng tôi có thể nói) thực sự ngẫu nhiên. Những người không thích sự ngẫu nhiên đã cố gắng loại bỏ tính ngẫu nhiên ra khỏi cơ học lượng tử kể từ khi nó bắt đầu, và tất cả những gì nó đã làm là chồng chất thêm bằng chứng rằng nó thực sự ngẫu nhiên.
David Thornley

@DavidThornley, ... cho đến khi ai đó tìm ra công thức.
CaffGeek

1
@Chad: Không có công thức theo nghĩa thông thường; đã được loại trừ bởi các thí nghiệm EPR. Chắc chắn có thể hình dung rằng tất cả đều mang tính quyết định, nhưng không phải theo cách dễ hiểu.
David Thornley

@DavidThornley, tôi biết đó là từ sai khi sử dụng. Tôi nghĩ rằng chúng tôi biết những gì tôi đã cố gắng nói. Gần như bất cứ khi nào ai đó nói điều gì đó là không thể, cuối cùng người khác sẽ chứng minh họ sai. Đó là bản chất con người.
CaffGeek

2
Điều đó giống như nói rằng cuối cùng ai đó sẽ tạo ra một cỗ máy có thể giải quyết vấn đề tạm dừng vì ai đó nói rằng điều đó là không thể. Đây không phải là vấn đề tìm phương trình, nó thực sự là ngẫu nhiên theo tất cả các thí nghiệm đã được chạy và toán học hỗ trợ nó.
Alex

2

Không có cách nào bạn có thể tạo ra một số ngẫu nhiên mà không có phần cứng đặc biệt. Vào năm thứ nhất, một vài bạn cùng lớp và tôi đã đề xuất một trình tạo số ngẫu nhiên có cơ bản là máy thu AM và điều chỉnh theo 4 kênh khác nhau, đưa đầu vào vào bộ chuyển đổi từ A sang D và thêm tất cả (modulo số tối đa của bạn). Do sự kết hợp của đầu vào tương tự từ bất kỳ số lượng trạm tùy ý nào là ngẫu nhiên và chúng tôi có thể tạo ra một số lượng lớn các số ngẫu nhiên từ bộ chuyển đổi A2D, chúng tôi đề xuất đây có thể là một máy phát tốt. Tất nhiên, ngay cả điều này không thực sự ngẫu nhiên theo nghĩa triết học, mặc dù đối với hầu hết các mục đích thực tế, điều này có thể làm việc.


2

Chủ nghĩa quyết định thực chất là một chức năng. Hãy nhớ từ Đại số rằng một hàm là sự tương ứng giữa một miền và phạm vi sao cho mỗi thành viên của miền tương ứng với chính xác một thành viên của phạm vi.

Vậy nếu f (x) = z, f (x)! = Y trừ khi y là z. Đó là một chức năng. Hãy tưởng tượng JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Cho dù bạn gọi bao nhiêu lần Add(2,3)thì nó vẫn luôn trả về 5. Nói cách khác, Add () là một hàm xác định.

Các yếu tố bên ngoài có thể khiến Add hành xử theo kiểu không xác định. Ví dụ, nếu bạn giới thiệu đa luồng vào phương trình. Đầu vào của con người cũng gây ra sự không xác định.

Bây giờ, đây là nơi mọi thứ trở nên thú vị.

Tất nhiên, bất cứ ai xem xét các phương pháp tạo ra các chữ số ngẫu nhiên, tất nhiên, đều ở trong tình trạng tội lỗi.

Lưu ý Von Neumann nói, "phương pháp sản xuất [...]". Đây không phải là nói về đầu vào của con người, đồng thời, tốc độ gió mẫu được đọc từ một công cụ chính xác hoặc các cách phi thuật toán khác để tạo đầu vào ngẫu nhiên cho một hàm xác định.

Điều này chỉ đơn giản nói rằng một chức năng hoặc hệ thống các chức năng sẽ không đột nhiên trở thành không xác định. Nói cách khác, Thêm (2,3) bằng cách nào đó sẽ không trả về 6 hoặc bất cứ thứ gì ngoài 5 được cung cấp cùng một đầu vào . Đó là điều không thể.

Các tác giả trích dẫn đưa nó một bước xa hơn.

Điều tốt nhất chúng ta có thể hy vọng là các số giả ngẫu nhiên, một dòng số xuất hiện như thể chúng được tạo ngẫu nhiên.

Bối cảnh trước đây được xác định là "trên bất kỳ thiết bị xác định nào". Tôi có thể kết thúc cuộc tranh luận ở đây. Nhưng, điều gì sẽ xảy ra nếu chúng ta thay đổi bối cảnh bằng cách giới thiệu một yếu tố mới cho hệ thống? Một yếu tố không xác định được thêm vào làm đầu vào làm cho hệ thống trở thành một hệ thống không xác định. Mặc dù, bằng cách loại bỏ yếu tố không xác định, chúng tôi được giảm trở lại một hệ thống xác định. Nếu bằng cách nào đó chúng ta có thể theo dõi hoặc tái tạo các đầu vào, chúng ta có thể tái tạo một kết quả. Nhưng toàn bộ đoạn này là không đúng với những gì tác giả đang nói. Ghi nhớ bối cảnh.

Người ta có thể tranh luận về ý nghĩa của chủ nghĩa không xác định. Một lần nữa, tangetenial. Ghi nhớ bối cảnh.

Vậy là anh ấy đúng. Trên bất kỳ thiết bị xác định nào, hệ thống xác định không thể tạo ra kết quả ngẫu nhiên thực sự.

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.