Losowe liczby z różnym prawdopodobieństwem trafienia

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ć?

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:

Object wylosowany = obiekty[(int)(Math.random() * 100)];
1
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
		}
	}
	
}
 
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 :)

0

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

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:

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?:)

0
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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1