Générer Une Pondéré Nombre Aléatoire

Je suis en train de concevoir une (bonne) manière de choisir un nombre aléatoire à partir d'une plage de numéros possibles où chaque nombre dans la plage a un poids. Pour faire simple: compte tenu de la gamme de nombres (0,1,2) choisissez un numéro de 0 a 80% de probabilité d'être sélectionné, de 1 a 10% de chances et de 2 a 10% de chances.

Cela fait environ 8 ans que mon collège stats de classe, vous pouvez donc imaginer la bonne formule pour que cela m'échappe pour le moment.

Ici est le "pas cher et sale" la méthode que j'ai trouvé. Cette solution utilise ColdFusion. Le vôtre peut utiliser n'importe quelle langue que vous souhaitez. Je suis un programmeur, je pense que je peux poignée de portage. Finalement ma solution a besoin d'être en Groovy - j'ai écrit celui-ci dans ColdFusion parce que c'est facile à écrire rapidement/test CF.

public function weightedRandom( Struct options ) {

    var tempArr = [];

    for( var o in arguments.options )
    {
        var weight = arguments.options[ o ] * 10;
        for ( var i = 1; i<= weight; i++ )
        {
            arrayAppend( tempArr, o );
        }
    }
    return tempArr[ randRange( 1, arrayLen( tempArr ) ) ];
}

//test it
opts = { 0=.8, 1=.1, 2=.1  };

for( x = 1; x<=10; x++ )
{
    writeDump( weightedRandom( opts ) );    
}

Je suis à la recherche de meilleures solutions, veuillez suggérer des améliorations ou des solutions de rechange.

InformationsquelleAutor Todd Sharp | 2011-12-08