2010-04-14 45 views
35

Tôi muốn nhận được N số ngẫu nhiên mà tổng của chúng là một giá trị.Lấy N số ngẫu nhiên mà tổng là M

Ví dụ, giả sử tôi muốn 5 số ngẫu nhiên mà tổng của chúng là 1

Sau đó, một khả năng có giá trị là:

0.2 0.2 0.2 0.2 0.2 

Khả năng khác là:

0.8 0.1 0.03 0.03 0.04 

Và như vậy trên. Tôi cần điều này để tạo ra ma trận đồ đạc của các phương tiện C mờ.

+0

Bản sao có thể có của [Số ngẫu nhiên thêm 100: Matlab] (https://stackoverflow.com/questions/8064629/random-numbers-that-add-to-100-matlab) – jberryman

Trả lời

48

Chỉ cần tạo N số ngẫu nhiên, tính tổng của chúng, chia mỗi số cho tổng.

+22

Sau đó nhân với M (trừ khi M là 1 như trong ví dụ). – ILMTitan

+8

Nó không phải là một ngẫu nhiên tốt như tăng N sẽ cung cấp cho một phương sai mà có xu hướng không – HAL9000

+3

Tôi muốn nhảy vào "giải pháp này không cung cấp câu trả lời phân phối tốt" banwagon – Ivan

39

Tạo các số ngẫu nhiên N-1 từ 0 đến 1, thêm các số 0 và 1 vào danh sách, sắp xếp chúng và lấy sự khác biệt của các số liền kề.

+0

Được rồi, điều này quá phức tạp. Có lẽ hữu ích nếu ai đó muốn giới hạn nó thành số nguyên mặc dù (rõ ràng là sử dụng một phạm vi lớn hơn 0 đến 1) –

+0

Nó không phải là ngay lập tức rõ ràng với tôi rằng điều này sẽ dẫn đến một phân phối bình thường cho N> 3 – ILMTitan

+1

Tôi không đảm bảo về toán tôi không hoàn toàn hiểu. –

0

Bạn hơi mỏng về những hạn chế. Rất nhiều và nhiều thủ tục sẽ hoạt động.

Ví dụ: số liệu có được phân phối bình thường không? Đồng phục?
Tôi giả định rằng tất cả các số phải dương và phân bố đồng đều xung quanh giá trị trung bình, M/N.

Hãy thử điều này.

  1. có nghĩa là = M/N.
  2. Tạo giá trị N-1 từ 0 đến 2 *. Đây có thể là số chuẩn giữa 0 và 1, u và giá trị ngẫu nhiên là (2 * u-1) * có nghĩa là tạo giá trị trong một phạm vi thích hợp.
  3. Tính toán tổng các giá trị N-1.
  4. Giá trị còn lại là tổng N.
  5. Nếu giá trị còn lại không phù hợp với các ràng buộc (từ 0 đến 2 *) lặp lại quy trình.
+0

"Giá trị còn lại" không được chọn thống nhất vì tổng các đồng phục (n-1) không thống nhất. –

1
  1. Tạo số ngẫu nhiên N-1.
  2. Tính toán tổng số cho biết.
  3. Thêm sự khác biệt giữa tổng được tính toán và tổng mong muốn vào tập hợp.

Bây giờ bạn có N số ngẫu nhiên và tổng của chúng là tổng mong muốn.

+0

Trừ khi bạn nhận được số cuối cùng là số âm. – Blindy

+1

Không có gì trong câu hỏi cấm các giá trị âm ... – Yuval

4

Trong Java:

private static double[] randSum(int n, double m) { 
    Random rand = new Random(); 
    double randNums[] = new double[n], sum = 0; 

    for (int i = 0; i < randNums.length; i++) { 
     randNums[i] = rand.nextDouble(); 
     sum += randNums[i]; 
    } 

    for (int i = 0; i < randNums.length; i++) { 
     randNums[i] /= sum * m; 
    } 

    return randNums; 
} 
+2

> Sau đó nhân với M (trừ khi M là 1 như trong ví dụ). - ILMTitan 14 tháng 4 lúc 18:49 –

+0

Ah. Tôi bỏ lỡ điều đó. Cảm ơn! – Vortico

+1

'randNums [i]/= tổng * m;' tương đương với 'randNums [i] = randNums [i]/(tổng * m);'. Điều này cần phải là 'randNums [i] = randNums [i]/tổng * m;' sao cho thứ tự của các phép toán là chính xác. –

26

Tôi nghĩ rằng đó là đáng chú ý là the currently accepted answer không đưa ra một phân bố đều:

"Chỉ cần tạo ra N số ngẫu nhiên, tính tổng của chúng, chia mỗi người bởi số tiền "

Để xem điều này, hãy xem trường hợp N = 2 và M = 1. Đây là một trường hợp tầm thường, vì chúng ta có thể tạo một danh sách [x, 1-x], bằng cách chọn x thống nhất trong phạm vi (0,1). Giải pháp được đề xuất tạo ra một cặp [x/(x + y), y/(x + y)] trong đó x và y là đồng nhất trong (0,1). Để phân tích điều này, chúng tôi chọn một số z sao cho 0 < z < 0,5 và tính xác suất rằng phần tử đầu tiên nhỏ hơn z. Xác suất này phải là z nếu phân phối đồng đều. Tuy nhiên, chúng tôi nhận

Prob (x/(x + y) < z) = Prob (x < z (x + y)) = Prob (x (1-z) < ZY) = Prob (x < y (z/(1-z))) = z/(2-2z).

tôi đã làm một số tính toán nhanh chóng và có vẻ như giải pháp duy nhất cho đến nay mà appers dẫn đến một phân bố đều được proposed by Matti Virkkunen:

"Tạo N-1 số ngẫu nhiên giữa 0 và 1, thêm các số 0 và 1 trong danh sách, sắp xếp chúng và lấy sự khác biệt của các số liền kề. "

+0

Trong ví dụ của bạn, x + y = 1 để P (\ frac {x} {x + y}

+0

@Apprentice Queue: Lưu ý rằng tôi chỉ phân tích trường hợp có 0 Accipitridae

+0

Tôi không nghĩ rằng phân tích của bạn là chính xác, vì bình thường/đồng phục đề cập đến việc phân phối các giá trị, không thay đổi khi chia phạm vi theo hằng số. Nếu phân phối ban đầu được thống nhất, thì chia cho tổng tạo ra một phân phối đồng đều để cộng tổng. Tương tự như vậy cho bình thường. –

2

Chỉ tạo số ngẫu nhiên N, tính tổng của chúng, chia mỗi số cho tổng.

Expanding on Guillaume's accepted answer, đây là chức năng Java thực hiện chính xác điều đó.

public static double[] getRandDistArray(int n, double m) 
{ 
    double randArray[] = new double[n]; 
    double sum = 0; 

    // Generate n random numbers 
    for (int i = 0; i < randArray.length; i++) 
    { 
     randArray[i] = Math.random(); 
     sum += randArray[i]; 
    } 

    // Normalize sum to m 
    for (int i = 0; i < randArray.length; i++) 
    { 
     randArray[i] /= sum; 
     randArray[i] *= m; 
    } 
    return randArray; 
} 

Trong một hoạt động kiểm tra, getRandDistArray(5, 1.0) trở như sau:

[0.38106150346121903, 0.18099632814238079, 0.17275044310377025, 0.01732932296660358, 0.24786240232602647] 
1

This problem tương đương với vấn đề tạo ra số ngẫu nhiên với một Dirichlet distribution. Để tạo ra N số dương mà sum đến một số nguyên dương M, trong đó mỗi sự kết hợp có thể cũng không kém phần khả năng:

  • Tạo N số ngẫu nhiên theo cấp số nhân phân phối. Một cách để tạo ra một số ví dụ có thể được viết như —

    number = -ln(1.0 - RNDU()) 
    

    nơi ln(x) là logarit tự nhiên của xRNDU() là một phương thức trả về một số ngẫu nhiên từ 0 trở lên và ít hơn 1 (ví dụ của JavaScript Math.random()) . Lưu ý rằng việc tạo ra những con số có phân bố đồng đều không phải là lý tưởng vì việc phân phối các kết hợp số ngẫu nhiên sẽ thành công.

  • Chia các số được tạo theo cách này theo tổng của chúng.
  • Multiply mỗi số của M.

Kết quả là N số trong một phân phối Dirichlet có tổng là xấp xỉ bằng M (tôi nói "xấp xỉ" vì làm tròn lỗi).

Sự cố này cũng tương đương với sự cố generating random numbers uniformly from an N-dimensional simplex.

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