J'écris un programme qui choisit un nombre aléatoire entre 0 et 1, puis entre dans une boucle while jusqu'à ce que le générateur de nombres aléatoires sélectionne une valeur supérieure à .5. Chaque fois que j'exécute le programme, le programme retourne 0 et boucle indéfiniment jusqu'à ce qu'il se bloque. Pourquoi cela se produit-il? Math.floor(Math.random()) ne devrait-il pas éventuellement sélectionner un nombre supérieur à .5?

var randomNumber = Math.floor(Math.random());
while(randomNumber < .5) {
var name = prompt("Do you want to play a game? Like checkers or something?");
if (name === "Yes") {
    console.log("Good jorb!");
} else if(name === "No.") {
    console.log("Go away!!!!!");
 else {
    console.log("I have no idea");
}

var randomNumber = Math.floor(Math.random());
}
-7
Darien Springer 11 juil. 2015 à 04:54

5 réponses

Meilleure réponse

Cette ligne retourne presque toujours 0 et c'est pourquoi elle n'entre pas dans le temps.

var randomNumber = Math.floor(Math.random());

Math.random () renvoie des valeurs flottantes inférieures à 1 à partir de 0 ... et avec Math.floor vous obtenez la partie int qui est en effet 0

1
leo.fcx 11 juil. 2015 à 03:41

Essayez ceci: (Désolé si je me trompe sur les longs décomptes ... il y en avait beaucoup ...)

while(true){
    var name=prompt("Do you want to play a game? Like checkers or something?");
    if(name.search(/^[yY](es|up)\.?$/)!=-1){
        console.log('Good jorb!');
    }else if(name.search(/^[nN]o(pe)?\.?$/)!=-1){
        console.log('F'+'U'.repeat(12)+'C'.repeat(13)+'K'.repeat(9)+' Y'+'O'.repeat(11)+'U'.repeat(18)+'!'.repeat(12));
    }else{
        console.log("I don't know, man. I don't know");
    }
    if(condition){
        break;
    }
}

Juste pour clarifier les expressions régulières: elles recherchent essentiellement les différentes formes du mot avec une majuscule ou non et une ponctuation ou non représentant le mot complet (^ est le début de la chaîne et $ est la fin de la chaîne). Cela devrait vous éviter bien des ennuis.

Oh, et essayez d'éviter while(true) pour de vraies pratiques de développement. for(var i=0;i<2e7;i++) ou quelque chose de similaire est une meilleure pratique, mais je pense que si c'est juste pour la ligne de commande, ça devrait aller.

0
Scelesto 11 juil. 2015 à 02:46

Votre boucle while ne fonctionnera jamais.
Math.random () renvoie un nombre n où 0 <= n <1
Math.floor (n) renvoie n arrondi vers zéro.

donc votre variable randomNumber sera toujours égale à zéro.

Vous pouvez également remplacer vos instructions if par un tableau de valeurs à vérifier.
Recherchez ensuite l'index du nom dans ce tableau.
si l'index est -1, il n'existe pas sinon enregistrez "Good Jorb!"

var randomNumber = Math.random();  
while(randomNumber > .5) {
  var name = prompt("Do you want to play a game? Like checkers or something?");
  var yesArray = ["Yes", "yes", "Yes.", "yes.", "Yup", "Yup.", "yup.", "yup"];
  if(yesArray.indexOf(name) == -1) {
    console.log("I don't know, man. I don't know");
  else {
    console.log("Good jorb!");
  } 
  randomNumber = Math.random();
}
1
Dean Brown 11 juil. 2015 à 02:43

Il existe plusieurs raisons:

  • 'Math.floor (Math.random ())', sera toujours nul donc la boucle ne démarrera jamais. Math.random () donnera un nombre compris entre 0 et 1 et vous posez celui-ci, ce qui signifie que vous arrondissez toujours vers le bas, ce qui signifie zéro.
  • Si vous voulez que le temps s'arrête, il vaut mieux «casser»; quand la condition est bonne.

Ce code fonctionnera:

var randomNumber = Math.random();
while(randomNumber > .5) {
var name = prompt("Do you want to play a game? Like checkers or something?");
if (name === "Yes") {
    console.log("Good jorb!"); break;
} else if(name === "Nope.") {
    console.log("Okay that is fine.");
} else {
console.log("I don't know, man. I don't know");
}
randomNumber = Math.random(); }

Mais maintenant, cela ne dépend pas seulement de la réponse si la boucle continuera mais aussi de randomNumber!

1
OSDM 11 juil. 2015 à 02:41

Votre variable randomNumber a déjà été initialisée avec votre première ligne, pour changer sa valeur, utilisez simplement randomNumber = newValuenewValue est la valeur à laquelle vous souhaitez la définir, en utilisant une méthode ou une valeur codée en dur. Vous n'avez pas besoin de réutiliser le mot clé var.

L'utilisation de la méthode Math.floor sur Math.random retournera toujours 0, car Math.random renverra un nombre compris entre 0 et 1, qui passera à 0.

Vous manquiez le crochet de fermeture sur votre boucle while.

Je vous ai nettoyé un peu le code pour enchaîner vos opérateurs booléens, bien qu'il existe de meilleures façons de construire ce code.

var randomNumber = Math(Math.random());
while(randomNumber > .5) {
    var name = prompt("Do you want to play a game? Like checkers or something?");
    if (name === "Yes" || name === "yes" || name === "Yes." || name === "yes." || name === "Yup" || name === "Yup." || name ===  "yup." || name === "yup")
    {
        console.log("Good jorb!");
    }

    else if(name === "No." || name === "No" || name === "no" || name === "no." || name === "nope" || name === "nope." || name ===  "Nope" || name === "Nope.")
    {
        console.log("That's too bad.");
    }
    else 
    {
        console.log("I don't know, man. I don't know");
    }
    randomNumber = Math(Math.random());
};// Close your while loop.
1
Daniel Hoffmann-Mitscherling 11 juil. 2015 à 02:24