Có ngay cả phân phối giả định rand()
là. Chúng tôi sẽ chứng minh điều này bằng cách cho thấy rằng mỗi đầu vào có thể tạo ra mỗi hoán vị với xác suất bằng nhau.
N = 2 có thể dễ dàng được chứng minh. Chúng tôi sẽ vẽ nó như là một cây nơi các em đại diện cho mỗi chuỗi bạn có thể nhận được bằng cách chèn ký tự sau dấu phẩy vào chuỗi ngoài cùng bên trái.
0,1 //input where 0,1 represent indices
01 10 //output. Represents permutations of 01. It is clear that each one has equal probability
Đối với N, chúng ta sẽ có tất cả các hoán vị cho N-1, và trao đổi một cách ngẫu nhiên các ký tự cuối cùng cho N
(N-1 0th permutation),N ..... (N-1 Ith permutation),N ________________________
/ \ / \ \
0th permutation of N 1st permutation.... (I*N)th permutation ((I*N)+1)th permutation .... (I*N)+(I-1)th permutation
cảm ứng shitty này nên dẫn bạn đến nó có thậm chí phân phối.
Ví dụ:
N = 2:
0,1
01 10 // these are the permutations. Each one has equal probability
N = 3:
0,1|2 // the | is used to separate characters that we will insert later
01,2 10,2 // 01, 10 are permutations from N-1, 2 is the new value
210 021 012 201 120 102 // these are the permutations, still equal probability
N = 4: (cong để hỗ trợ đọc)
0,1|23
01,2|3 10,2|3
012,3 021,3 210,3 102,3 120,3 201,3
1203 1230 1302 3201
2103 2130 2301 3102 1023 1032 1320 3021
etc
Giả sử "tồi tệ" có nghĩa là "tạo ra phân phối không đồng đều", phải không? –
@ R.MartinhoFernandes: Đúng vậy. 'Nó có làm sai lệch các xác suất kết quả không? ' – fredoverflow
Nó giống như một câu hỏi toán học. - Là một câu hỏi lập trình, tại sao bạn triển khai hàm này trong C++? Nó nằm trong thư viện chuẩn (random_shuffle). – UncleBens