2010-10-23 9 views
1

Il y a beaucoup de questions SO sur les pondérations aléatoires, mais toutes reposent sur le biais allant au nombre le plus élevé. Je veux biaiser vers le plus bas.Sélection aléatoire de la pondération la plus faible

Mon algorithme pour le moment, est pondéré aléatoirement avec un biais vers les valeurs les plus élevées. Comment est-ce que je pourrais convertir cela en biaiser des valeurs plus basses? C'est à dire que je veux dans 100 échantillons, l'échantillon de poids [0] soit choisi 66% du temps; et poids [1] 33% du temps (c.-à-d. l'inverse de ce qu'ils sont maintenant).


exemple à la main pour Omni, somme ref - poids solution [x]

Original: 
1 | 1 | 1% 
20 | 21 | 20% 
80 | 101 | 79% 

Desired: 
1 | ? | 79% 
20 | ? | 20% 
80 | ? | 1% 

Now sum - weights[i] 

100(101 - 1) | 100 | 50% 
81(101 - 20) | 181 | 40% 
21(101 - 80) | 202 | 10% 
+0

Oh. :-(Oups, j'aurais dû le faire avec plus de précautions – Omnifarious

Répondre

1

Que diriez-vous ceci:

template<typename InputIterator> 
vector<int> generateWeightMap(InputIterator first, InputIterator last) 
{ 
    int value = 0; 
    vector<int> weightMap; 
    while(first != last) 
    { 
     while((*first)-- > 0) 
      weightMap.push_back(value); 
     ++first; 
     value++; 
    } 
    return weightMap; 
} 
...later 

int weights[] = {1,19,80}; 
vector<int> weightMap = generateWeightMap(weights, weights + 3); 

int weighted_random = weightMap[urandom(weightMap.size())]; 
+0

Merci, mais j'ai juste décidé d'aller avec 1/x. Avec {1,2,3}, ça donne {50%, 33%, 16%} ... ce qui fonctionne pour ce que je veux, l'accent étant mis sur la vitesse, l'allocation de mémoire était quelque chose que je voulais éviter du mieux que je pouvais. – dcousens