Losowe liczby z różnym prawdopodobieństwem trafienia

Losowe liczby z różnym prawdopodobieństwem trafienia
NavarioN
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:10
0

Chcę zrobić pewne losowanie, w którym każdy obiekt ma różne szanse na zostanie wylosowanym.
np.
1 - 10%
2 - 5%
3 - 32%
4 - (pozostałe) 53%

Chcę później łatwo dodawać kolejne obiekty z różnymi szansami. Ma ktoś pomysł jak to zrobić?

edytowany 1x, ostatnio: NavarioN
M3
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:104
0

Robisz tablice 100-elementowa, tworzysz obiekty i dodajesz pokolei do tablicy referencje do nich (tyle referencji w tablicy ile % szans ma obiekt). A potem to juz prosto:

Kopiuj
Object wylosowany = obiekty[(int)(Math.random() * 100)];
JA
A jakby mu się zachciało wprowadzić prawdopodobieństwo 55.123% Tablica mająca 100000 elementów?
hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 3 lata
1
Kopiuj
public class Random {

	public static void main(String [] args)
	{
		double d = Math.random();
		if (d < 0.53) {
			//53% szansy
		}
		else if (d < 0.85) {
			//32% szansy
		}
		else if (d < 0.95) {
			//10% szansy
		}
		else {
			//5% szansy
		}
	}
	
}
 

Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
JA
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Białystok
  • Postów:258
0

http://stackoverflow.com/questions/17250568/randomly-choosing-from-a-list-with-weighted-probabilities

Naiwne rozwiązanie w pierwszej odpowiedzi, opisane i zaimplementowane rozwiązanie z czasem stałym w drugiej. Powodzenia :)

NavarioN
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:10
0

Ok, zrobiłem to tak:
wartości zapisałem w statycznej mapie do której dodałem kilka rekordów:

Kopiuj
static HashMap<String, Double> people = new HashMap<String, Double>();
MapObject.people.put("Ala", 0.3);
MapObject.people.put("ma", 0.3);

A następnie tam gdzie chciałem przeiterowałem ją tak:

Kopiuj
double r = Math.random();
double value = 0.0;
					
for (Map.Entry<String, Double> entry : MapObject.people.entrySet()) {
     value += entry.getValue();
     if(r < value) {
           subtype = entry.getKey();
           break;
     }
}

if(subtype == "") {
	subtype = "kota";
}

Co o tym myślicie?:)

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
0
Kopiuj
int randomIndex(int [] weights) {
    int sum = 0;
    for(int x : weights)
        sum += x;
    int r = generator.nextInt(sum);
    for(int i=0; i<weights.length; ++i) {
        r -= weights[i];
        if (r<0)
           return i;
    }
    assert r>=0;
    return -1;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.