7
votes

Générer un nombre aléatoire étrange entre une plage donnée

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

pour générer des NO aléatoire: xxx

se référer Comment générer des entiers aléatoires dans une plage spécifique dans Java?

méthode pour générer des aléatoires impairs Non: xxx

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 ??


1 commentaires

Une autre façon serait de générer un numéro de 0 à 2 ( (6-1) / 2 ) 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.


10 Réponses :


1
votes

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 )))


0 commentaires

2
votes

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;  
  }


0 commentaires

7
votes

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));


3 commentaires

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?



0
votes

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.

Stick avec la solution de CrazyCastA's ou J.A.


0 commentaires

1
votes

Pour ce faire, vous devez générer un deuxième nombre pseudo-aléatoire pour ajouter ou soustraire 1 xxx


0 commentaires

0
votes

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:

assumer math.random () renvoyé x.y; Si x est même, return (y> = 0.5)? (x + 1) :( x-1)

cela va-t-il randomisé un peu?


1 commentaires

Je suppose que c'est ce que ma question est ... je veux une probabilité égale pour tous les chiffres allant de x à y



1
votes

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;


0 commentaires

1
votes

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;


0 commentaires

0
votes

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;
          }
    }


0 commentaires

0
votes

en Java 1.7 ou plus tard, j'utiliserais THFLOCALRANDOM : xxx

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.


0 commentaires