J'aimerais avoir un nombre aléatoire comme celui-ci: (en C #) mais il est important que le nombre aléatoire soit plus proche de 8, (ou qu'il soit généralement grand),
Je veux dire que si nous utilisons un pour: p> le résultat est comme celui-ci; p>
6 Réponses :
Vous devez pondérer vos résultats. Vous pouvez le faire avec quelque chose comme ceci: Si je savais que ma plage était petite et cohérente, j'utiliserais la table - c'est trivial pour en faire sa propre classe. P> Pour la complétude, j'ajouterai également cette classe. Cette classe emprunte à partir du traitement de l'image et utilise la fonction de correction gamma: une valeur comprise entre 0 et 1 élevé sur gamma, qui renvoie une valeur comprise entre 0 et 1 mais distribué plus à l'extrémité basse si gamma 1.0. p> (des commentaires, déplacé de getweetRandom (). Aussi ajouté à la vérification de la plage Suivant ()) P> OK, allons vraiment en ville ici. Je canalise John Skeet pour cela - c'est une classe abstraite avec une propriété de modèle qui renvoie une fonction de transformation qui correspond à la plage [0..1) à [0..1) et échoue au nombre aléatoire à cette plage. J'ai également réimprimé gamma en termes de celui-ci et j'ai également mis en œuvre le péché et le cos aussi. P> public abstract class DelegatedRandom
{
private Random _r = new Random();
public int Next(int low, int high)
{
if (high >= low)
throw new ArgumentOutOfRangeException("high");
double rand = _r.NextDouble();
rand = Transform(rand);
if (rand >= 1.0 || rand < 0) throw new Exception("internal error - expected transform to be between 0 and 1");
return (int)((high - low) * rand) + low;
}
protected abstract Func<double, double> Transform { get; }
}
public class SinRandom : DelegatedRandom
{
private static double pihalf = Math.PI / 2;
protected override Func<double, double> Transform
{
get { return r => Math.Sin(r * pihalf); }
}
}
public class CosRandom : DelegatedRandom
{
private static double pihalf = Math.PI / 2;
protected override Func<double, double> Transform
{
get { return r => Math.Cos(r * pihalf); }
}
}
public class GammaRandom : DelegatedRandom
{
private double _gamma;
public GammaRandom(double gamma)
{
if (gamma <= 0) throw new ArgumentOutOfRangeException("gamma");
_gamma = gamma;
}
protected override Func<double, double> Transform
{
get { return r => Math.Pow(r, _gamma); }
}
}
Ah, tu m'as battu avec cette réponse. +1.
C'est bien pour des nombres relativement petits, mais si vous voulez une distribution centrée sur 1000000, vous avez besoin d'un très grand tableau ... je pense qu'il serait préférable d'utiliser une fonction de distribution.
8 était un exemple, en fait, nous avons: int profondément au lieu de 10, et rien au lieu de 8 (je veux dire que c'est près de 8 ou 7 ou 9)
Vous devriez aller de l'avant et écrire cela - il y a de la place pour plus de réponses.
Wow! C'est tellement simple que je touche juste ça =)
Je suggérerais également de déplacer la nouvelle déclaration random () de la méthode de la méthode car Dot Net a l'habitude d'être moins aléatoire que prévu avec un objet aléatoire nouvellement instancié.
Merci, mais en utilisant 10 * COS (nombre aléatoire), m'aide.
Même réponse que moi. Bien que je suis d'accord avec le commentaire sur de grands tableaux
@Vahid - Cosine est un choix étrange - il va peser plus à 0 (car COS (0) est 1). Vous voudrez probablement utiliser le sinus et l'échelle de la thêta entre 0 et Pi / 2.
Je pense que vous devez toujours ajouter un paramètre "tenseur" entre le min et max, qui sert de centre de distribution souhaité. J'imagine que l'utilisation de cela pourrait être aussi "simple" comme (en utilisant r = (max-min) code>): 'min + (((((((tenseur - min) / r) * R) % R) '. Quelque chose comme ça va déplacer votre courbe de distribution sur le nombre souhaité.
Cela me semble que vous voulez que vos numéros aléatoires soient pondérés vers le haut de gamme - serait-ce une évaluation juste? P>
quelque chose comme Ce peut vous aider (c'est Java, mais les principes s'appliquent) p>
Non, ce n'est pas juste, mais c'est important.
Vous avez besoin d'une fonction de distribution qui prend un numéro entre 0 et 1 et la convertit en un nombre dans la plage que vous souhaitez, avec un poids plus élevé sur un nombre spécifique. Vous pouvez créer une telle fonction avec des fonctions trigonométriques (péché, cos, ...), exponentielle ou peut-être un polynôme. P>
mise à jour: consultez Cette page Pour plus d'informations sur la distribution de probabilité P >
WTF est un polynôme? Methinks Vous êtes allé pour le bouton "Publier ta réponse" trop rapidement
Un polynôme est une fonction algébrique écrite sous la forme: F (x) = an * x ^ n + (an-1) * x ^ (x-1) + ... A2 * x2 + a1x + a0;
Non, ce serait un polynôme i>. Je ne vois personne ici apprécie mon (souvent étrange, selon elle qui doit être obéi) humour. Je pense que je vais juste errer au lit.
Pax, j'ai ri de ton "trop vite" dans une blague. Vous êtes peut-être un imbécile, mais au moins vous n'êtes pas le seul.
@Pax: Je voulais dire un polynôme ... Désolé, mon anglais n'est pas si bon;)
Dans certaines langues, le concept s'appelle "Polinom" et il est facile pour les anglophones non indigènes de l'utiliser au lieu de polynomial
Au lieu d'utiliser la variante de tableau, vous pouvez également consulter ce alors répondez qui a Un lien vers iridium math.net qui implémente des générateurs aléatoires non uniformes. P>
Les avantages de la variante de la matrice sont que vous obtenez une approche plus dynamique sans avoir à réécrire le tableau tout le temps. Vous pouvez également faire des choses qui seraient pratiquement impossibles à la variante de la matrice (grand nombre aléatoire non uniforme). P>
Avec une sorte de pondération supplémentaire qui devrait être possible. Dépend de la manière dont vous spécifiez "près de huit". Un moyen très simple de le faire est ceci:
for (int i =0; i<...;i++) { n = r.next (0,100); write: (n*n) / 1000 }
Pas exactement ce que vous recherchez, mais un moyen très simple de se rapprocher d'une distribution normale des nombres consiste à ajouter plusieurs générations ensemble. P>
Un exemple classique de cette technique est dans le jeu Donjons et Dragons où une force de caractères pourrait être déterminée en roulant trois dés six faces et en ajoutant les résultats. Cela donne une gamme de 3 à 18 chiffres autour de 10 les plus probables. Les variantes comprennent: p>
Alternativement, Ce est assez proche ... < / p>
Vous demandez donc des chiffres aléatoires qui, err, ne sont pas aléatoires?
Non, il ne veut pas, il veut juste une distribution différente (plus de Gauss - environ 8 de Gauss, pas uniformément distribué à tous les chiffres)
Je voudrais générer des nombres aléatoires pondérés.