2013-02-19 15 views
7

Próbuję utworzyć skrypt, który losowo podzieli wartość 4 na 12 różnych zmiennych. Nie mogę wymyślić dobrego sposobu, aby zrobić to właściwie. Myślałem o randomizowaniu liczb tak, aby były bliskie 0,33 (1/12 z 4), ale często prowadziło to do zbyt małej liczby ostatnich liczb. Czy ktoś próbował czegoś takiego wcześniej lub miał jakieś świetne pomysły na to, jak zrobić to tak przypadkowo i równomiernie, jak to tylko możliwe?Dzielenie liczby na przypadkowe, nierówne części

Odpowiedz

17

Generowanie 12 liczb losowych z ulubionego generatora liczb losowych, nazywając je r1..r12.

Dodaj je wszystkie, zadzwoń pod numer sum.

Twoja pierwsza losowa część z 4 to (r1/sum)*4. Reszta powinna być oczywista.

+0

To było genialne! Wielkie dzięki! – Tom

+0

Należy zauważyć, że to rozwiązanie nie generuje zestawów liczb, które są równomiernie rozmieszczone w logiczny sposób, ale jest to rozwiązanie, które większość ludzi wybiera, ponieważ nie rozumie, dlaczego nie wytwarza czegoś naprawdę jednolitego. –

+0

@woodchips: byłoby pomocne dostarczenie pewnych uzasadnień dla tej krytyki (choć jest prawidłowa), a jeszcze bardziej pomocna jest odpowiedź, która generuje jednolicie rozproszone partycje.Próbowałem zrobić to drugie, chociaż nie jestem pewien, czy to też jest poprawne. – rici

8

Generowanie dowolnej liczby losowej większej niż 1 i po przeskalowaniu do wymaganej sumy.

przykład:

  • żądanej sumy: 4
  • Liczby losowe: 1 2 3 4 5 6 7 8 9 10 11 12
  • Suma = 78
  • przeskalowanych liczby:

1 przeskalowany do (1 * 4)/78

2 przeskalowywane (2 * 4)/78

...

12 przeskalowywane (12 *), 4/78

2

następujący algorytm zapewnia równomiernie rozmieszczone przegrody, przy założeniu, że możliwe jest generowanie równomiernie rozłożonych liczb losowych w ciągłym zakresie (lub, co najmniej, w dyskretnym zakresie o wystarczająco wielu możliwych wartościach, że prawdopodobieństwo powielenia jest znikome).

celu wytworzenia partycji t do k wartości:

  • Generowanie k-1 równomiernie rozłożonych wartości w zakresie [0, t].

  • Posortuj je i dodaj 0 na początku ina końcu.

  • Użyj sąsiednich różnic jako partycji.