Math.round (Math.random) renvoie 3 numéros uniques question

D'accord, j'ai donc besoin de renvoyer 3 nombres aléatoires qui ne sont pas égaux. Ensuite, lorsque vous exécutez la fonction à nouveau, les nombres ne doivent pas non plus être l'un des nombres sélectionnés lors de l'exécution précédente.

J'ai écrit une fonction pour le faire, mais je reste incontournable comme l'une des valeurs de retour.

Qu'est-ce que je fais mal ici?

f1 = 0; f2 = 0; f3 = 0; function randomNumber(r1, r2, r3) { ranNumb = Math.floor(Math.random()*51); if (ranNumb != r1 && ranNumb != r2 && ranNumb != r3) { return ranNumb; } else { randomNumber(r1, r2, r3); } } $(document).ready( function() { $("#left_btn, #right_btn").click(function() { f1 = randomNumber(f1, f2, f3); f2 = randomNumber(f1, f2, f3); f3 = randomNumber(f1, f2, f3); alert(f1+" "+f2+" "+f3); }); }); 

Votre problème est ici:

 else { randomNumber(r1, r2, r3); } 

Vous devez return le résultat de l'appel récursif à randomNumber .

 else { return randomNumber(r1, r2, r3); } 

Vous avez manqué un return :

 else { return randomNumber(r1, r2, r3); } 

Dans randomNumber , si le nombre généré est égal à l'un des trois, alors vous appelez à nouveau randomNumber . Mais vous avez oublié de retourner le résultat!

Ne voulez-vous pas dire à la partie "else" de la fonction randomnumber de renvoyer réellement randomnumber au lieu de simplement le rappeler?

Peut-être être plus facile d'utiliser une boucle while, voici un code que j'ai adapté:

 function generateUniqueNumbers(num_of_nums, maxrange) { //initialise an array var arr = []; //generate x unique numbers into an array while(arr.length < num_of_nums){ //generate random number var randomnumber = Math.ceil(Math.random() * maxrange) //initialise boolean var found=false; //loop through the array for(var i=0; i<arr.length; i++){ //if the number exists in the array then break from the while loop if(arr[i] == randomnumber){found=true;break;} } //if the number is not found then add it to the array if(!found)arr[arr.length] = randomnumber; } //if all numbers have been collected return array if(arr.length == num_of_nums){return arr;} } 

Dans l'état actuel des fonctions, il peut éventuellement renvoyer 0 en tant que numéro, car la plage la plus élevée n'est spécifiée que mais elle devrait faire ce dont vous avez besoin 🙂