Comment générer un nombre aléatoire étrange entre une plage donnée ..
Pour par exemple: pour la plage comprise entre 1 et 6 .. N ° aléatoire est la méthode 3 ou 1 ou 5 p>
pour générer des NO aléatoire: p> se référer Comment générer des entiers aléatoires dans une plage spécifique dans Java? p> méthode pour générer des aléatoires impairs Non: p> Cette fonction convertira toujours 2 en 3 et pas 1
Pouvons-nous faire une fonction plus aléatoire qui peut convertir 2 parfois en 3 et parfois en 1 ?? p> p>
10 Réponses :
Au lieu de générer un nombre aléatoire compris entre 0 et 6, générer un entre 0 et 5 et arrondir jusqu'au nombre impair le plus proche, ainsi que vous aurez une distribution parfaite (33% pour chaque possibilité (1, 3, 5 ))) p>
Si vous souhaitez inclure le hasard dans la direction aussi bien, utilisez un nombre aléatoire pour la même chose.
int randomDirection = Min + (int)(Math.Random()*((Max-Min)+1));
if(randomDirection%2==0) { // any condition to switch the direction
Random_No = Random_No + 1;
} else {
Random_No = Random_No - 1;
}
En supposant que Max est inclusif, je suggérerais ce qui suit:
if (Max % 2 == 0) --Max; if (Min % 2 == 0) ++Min; Random_No = Min + 2*(int)(Math.random()*((Max-Min)/2+1));
En fait, romedius a fait les trucs intelligents; Je viens de nettoyer l'édition un peu, accidentellement mais inévitablement d'obtenir un crédit indu. Vous pouvez voir les détails de qui a fait quoi dans l'historique de révision (cliquez sur l'heure par l'étiquette «modifiée»).
@Crazycata, vous n'avez pas besoin de la première ligne où vous décrémentez max.
@Crazycata. Grande solution. Mais pourquoi nous avons besoin de "si (min% 2 == 0) ++ min". ? Je pense que nous n'avons pas besoin de changer la valeur de min?
mathématiquement les chiffres ne gagneront rien en arrondissant ou en descendant à la dernière étape. Au lieu de cela, le premier et le dernier numéro ont une chance de 50% pour être choisis sur tous les autres numéros. P>
Stick avec la solution de CrazyCastA's ou J.A. P>
Pour ce faire, vous devez générer un deuxième nombre pseudo-aléatoire pour ajouter ou soustraire 1
Que diriez-vous de vérifier le retour de Math.Random () comme un numéro flottant. Si sa partie INT est un nombre pair, puis convertissez-la en haut / bas en fonction de sa partie flottante. Comme: p>
assumer math.random () renvoyé x.y; Si x est même, return (y> = 0.5)? (x + 1) :( x-1) p>
cela va-t-il randomisé un peu? p>
Je suppose que c'est ce que ma question est ... je veux une probabilité égale pour tous les chiffres allant de x à y
Je me demande pourquoi les autres réponses utilisent tous l'intensité d'intensité pour générer le nombre aléatoire. Pourquoi ne pas générer directement entier aléatoire fort> directement, qui est plus précis que le nombre réel de manière réelle?
Random rn = new Random(); if(maximum % 2 == 1) maximum = maximum + 1; // turn right bound to even if(minimum % 2 == 0) minimum = minimum - 1; // turn left bound to odd int range = (maximum - minimum + 1) / 2; int randomNum = rn.nextInt(range) * 2 + minimum;
Pour générer un nombre impair à partir d'un entier, vous pouvez utiliser n * 2 + 1 code> vraiment vous générez des nombres aléatoires et appliquez une transformation par la suite int num = min / 2 + random.nextInt((max + 1) / 2 - min / 2);
num = num * 2 + 1;
laissez le coudre supérieur ou ci-dessous dépendent d'un epsilon aléatoire.
Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
if(Random_No%2 ==0)
{
if((Max%2)==0)&&Random_No==Max)
{
Random_No = Random_No - 1;
}
else{
epsilon = Math.Random();
if(epsilon > 0.5)
Random_No = Random_No + 1;
else
Random_No = Random_No - 1;
}
}
La raison d'utiliser threadlocalrandom est expliquée Voici . Notez également que la raison pour laquelle nous +1 à l'entrée à ThreadLocalrandom.nextint () est de vous assurer que le max est inclus dans la plage. P> P>
Une autre façon serait de générer un numéro de 0 à 2 (
(6-1) / 2 code>) et double puis incrémentez le résultat. Il est facile de généraliser ceci à une gamme commençant par n'importe quel nombre.