2009-10-07 34 views
5

Tôi cần một trình tạo số ngẫu nhiên để chọn số trên một phạm vi được chỉ định với mức có thể lập trình được.Trình tạo số ngẫu nhiên không đồng nhất?

Ví dụ, tôi cần phải lấy số từ 2 đến 14 và tôi cần trung bình của những con số ngẫu nhiên để được 5.

tôi sử dụng máy phát điện số ngẫu nhiên rất nhiều. Thông thường tôi chỉ cần một bản phân phối đồng đều.

Tôi thậm chí không biết phải gọi loại phân phối này là gì.

Cảm ơn bạn đã hỗ trợ hoặc hiểu rõ bạn có thể cung cấp.

+9

Bạn có chắc chắn rằng bạn cung cấp đầy đủ thông tin về sự phân bố? Tôi tin rằng giá trị trung bình là không đủ. Hãy xem xét ví dụ này: giả sử chúng ta tạo ra các số ngẫu nhiên từ '{0, 1, 2}' với 1 giá trị trung bình. Bây giờ hãy xem hai máy phát điện này: 'Generator1 (0: 40%, 1: 20%, 2: 40%)', 'Generator2 (0: 10%, 1: 80%, 2: 10%)'. Đối với cả hai kết quả trung bình sẽ là 1. –

+1

Gần trùng lặp: http://stackoverflow.com/questions/977354/generating-non-uniform-random-numbers. Và các bản phân phối giả ngẫu nhiên không phẳng là một chủ đề chuẩn đã được giải quyết nhiều lần trên SO. Cung cấp thêm thông tin và chúng tôi có thể chỉ cho bạn đúng hướng. – dmckee

+0

Nếu phân phối mục tiêu không dễ dàng được thể hiện bằng cách xem PDF có thể tích hợp tại: http://stackoverflow.com/questions/423006/how-do-i-generate-points-that-match-a-histogram – dmckee

Trả lời

0

ý tưởng đầu tiên của tôi sẽ là:

  • tạo ra các số trong phạm vi 0..1
  • quy mô đến phạm vi -9..9 (x-0,5; x * 18)
  • thay đổi phạm vi 5 -> -4 .. 14 (thêm 5)
  • cắt ngắn phạm vi để 2..14 (loại bỏ số < 2)

mà nên cung cấp cho bạn các số trong phạm vi mà bạn muốn.

+0

Nhưng khi bạn loại bỏ các con số <2 trung bình của bạn di chuyển lên từ 5 phải không? –

6

Bạn có thể sử dụng binomial distribution nếu bạn hài lòng với hình dạng của phân phối đó. Đặt n = 12 và p = 0,25. Điều này sẽ cung cấp cho bạn một giá trị từ 0 đến 12 với giá trị trung bình là 3. Chỉ cần thêm 2 vào mỗi kết quả để có được phạm vi và có nghĩa là bạn đang tìm kiếm.

Chỉnh sửa: Để triển khai, bạn có thể tìm thấy thư viện cho ngôn ngữ bạn đã chọn hỗ trợ bản phân phối không đồng nhất (tôi đã written one myself for Java).

Phân phối nhị thức có thể xấp xỉ khá dễ dàng bằng RNG đồng nhất. Chỉ cần thực hiện các thử nghiệm n và ghi lại số lần thành công. Vì vậy, nếu bạn có n = 10 và p = 0,5, nó giống như lật một đồng xu 10 lần liên tiếp và đếm số đầu. Đối với p = 0,25 chỉ tạo ra các giá trị phân bố đồng nhất giữa 0 và 3 và chỉ đếm số không thành công.

Nếu bạn muốn triển khai hiệu quả hơn, có một thuật toán thông minh ẩn trong các bài tập của tập 2 của Nghệ thuật lập trình máy tính của Knuth.

+0

liên kết tới ["(tôi đã viết một bản thân mình cho Java)."] (Https://uncommons-maths.dev.java.net/) không có sẵn – yishaiz

+1

@yishaiz Chỉ cần cập nhật nó. –

0

Bạn cần trình tạo số ngẫu nhiên được phân phối/có trọng số. Here's a reference để giúp bạn bắt đầu.

3

Bạn chưa cho biết mình đang phân phối cái gì. Về ví dụ cụ thể của bạn, một chức năng tạo ra sự phân bố đồng đều giữa 2 và 8 sẽ thỏa mãn yêu cầu của bạn, đúng như bạn đã viết chúng :)

+0

Tôi nghĩ rằng OP dự định cho các giá trị từ 9-14 để có một số xác suất được chọn. – fbrereto

1

Nếu bạn muốn phân phối ngẫu nhiên số ngẫu nhiên, bạn có thể có để triển khai một số loại ánh xạ, ví dụ:

// returns a number between 0..5 with a custom distribution 
int MyCustomDistribution() 
{ 
    int r = rand(100); // random number between 0..100 
    if (r < 10) return 1; 
    if (r < 30) return 2; 
    if (r < 42) return 3; 
    ... 
} 
1

Bạn có thể tạo một PRNG không đồng nhất từ ​​đồng phục. Điều này có ý nghĩa, như bạn có thể tưởng tượng lấy một PRNG thống nhất trả về 0,1,2 và tạo một PRNG mới, không đồng nhất bằng cách trả về 0 cho các giá trị 0,1 và 1 cho giá trị 2.

Có nhiều điều hơn nếu bạn muốn có các đặc điểm cụ thể về việc phân phối PRNG mới, không đồng nhất của bạn. Điều này được đề cập đến trên the Wikipedia page on PRNGsZiggurat algorithm được đề cập cụ thể.

Với những manh mối đó, bạn sẽ có thể tìm kiếm một số mã.

1

Dựa trên Wikipedia sub-article về máy phát không đồng nhất, có vẻ như bạn muốn áp dụng đầu ra của bộ tạo số giả ngẫu nhiên thống nhất cho phân phối vùng đáp ứng giá trị mong muốn.

0
Assign all numbers equal probabilities, 

khi currentAverage không bằng intendedAverage (whithin lề thể)

pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again) 

if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage) 

    increase pickedNumber's probability by delta at the expense of all others, conserving sum=100% 

else 

    decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100% 

end if 

delta=0.98*delta (the rate of decrease of delta should probably be experimented with) 

cuối trong khi

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