2012-02-20 1 views
0

Donc, j'ai un problème. Fondamentalement, je n'ai pas assez prêté attention aux maths de lycée, et maintenant je suis bloqué. J'ai besoin de générer des nombres aléatoires entre 1 et 20 avec un fort accent sur celui entre 1 et 5, un accent léger sur 5-10, et un accent faible sur 10-20. Je ne comprends pas tous les mots de probabilité fantaisie et tout ce qu'ils disent dans les articles que j'ai rencontrés. Toute aide que vous pourriez fournir serait appréciée. Merci!Numéros aléatoires probabilistes?

+0

il y a eu plusieurs questions à ce sujet sur le SO .... En fait –

+0

, Je programme depuis 5 ou 6 ans maintenant, et j'ai juste une question mathématique simple. À moins que vous n'ayez quelque chose d'utile à ajouter, les commentaires ne sont pas appréciés. – Jack

+0

@Jack Étant agressif n'est probablement pas le meilleur moyen d'obtenir la réponse que j'étais à mi-chemin pour vous .. – Marty

Répondre

3

Vous pouvez utiliser cette formule pour générer un nombre aléatoire dans l'intervalle [bas, haut]:

var randomNumber:int = Math.floor(Math.random()*(1+high-low))+low; 

Vous pouvez le mettre dans une fonction si vous voulez.

Maintenant, un moyen facile d'avoir une probabilité différente pour les trois intervalles que vous avez fournis, est de faire quelque chose comme ceci:

var random:Number = Math.random(); 
if (random < 0.75) { 
    // generate random number in [1, 5] 
} else if (random < 0.95) { 
    // generate random number in [6, 10] 
} else { 
    // generate random number in [11, 20] 
} 
+0

Cela fonctionne parfaitement, merci! – Jack

0

Vous pouvez également utiliser quelque chose le long des lignes ci-dessous si vous avez besoin d'un « lisse " Distribution. C'est à dire. la distribution varierait graduellement entre les valeurs les plus basses et les plus élevées, l'accent devant être mis sur les valeurs les plus basses dans le cas ci-dessous.

private function univenlyDistributedRandom(low:int, high:int):Number 
    { 
     return low + (1 - Math.pow(Math.random(), 4)) * (high - low);   
    } 

Vous pouvez, bien sûr, utiliser toute autre fonction (hyperbole, ou etc sinus) pour générer des variations légèrement différentes. Une chose amusante cependant. Si vous utilisez un moteur de tweening, vous avez probablement déjà ce genre de fonctions! Toute fonction d'accélération qui n'est pas linéaire et appliquée à la sortie du Math.random() affecterait la distribution de façon "lisse". Donc, si, par exemple, vous voyez que la fonction d'accélération fait quelque chose comme "ça va lent au début, mais plus vite, plus vite, et encore plus vite", cela voudrait dire que la distribution que vous pourriez obtenir serait biaisée les plus petits nombres et les plus grands nombres se produiraient moins souvent.

0

J'utiliserais l'une des équations de penner. http://www.robertpenner.com/easing/

Générer un nombre compris entre 0 et 1. Donne à l'équation de Penner, il renvoie un nombre compris entre 0 et 1. Multipliez ce nombre par la valeur maximale que vous voulez. Arrondissez-le.

number = Math.round(MyTransformFunction(Math.random())*MaxNumber) 

function MyTransformFunction(x){ 
    return x*x; 
} 

Toutes les autres fonctions qui renvoient un nombre compris entre 0-1 pour une entrée entre 0-1 fonctionnera:

return -x*x; 
return Math.sqrt(x); 
Questions connexes