0
votes

Comment corriger: exception dans le fil "Main" Java.Lang.ArrayIndexOtOfboundSException "pour une gamme booléenne de nombres aléatoires en Java

Je fais un programme où j'obtiens combien de nombres aléatoires qu'ils veulent et le plus grand nombre qu'ils veulent aller jusqu'à, mais quand je gère le code, cela ne me donne pas la quantité de chiffres qu'ils ont demandés. Cela me donne un numéro ou aucun. Ensuite, il dit "Exception dans le fil" Main "Java.Lang.ArrayInDexOtOfboundSException: 9 à la pratique4.practice4.main (pratique4.java:38) "En rouge.

Welcome to the Lottery Number Generator!
How many numbers are in your lottery?
6
What is the highest possible number?
? 30
1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 21
    at practice4.practice4.main(practice4.java:35)


3 commentaires

Pourquoi utilisez-vous un boolean [] pour cela?


Mon professeur a dit que nous devions utiliser Boolean [] pour cela.


Randomnum = MATH.RANDOM () * HAUTNUMOMBER + 1; entraînera un nombre compris entre 1 et 30 (compte tenu de votre entrée). numéroté utilisé n'a que 6 éléments, de sorte que votre utilisation de numériquement [affichage - 1] est ce qui cause le problème


3 Réponses :


1
votes
do
{
    randomNum = Math.random() * highestNumber + 1;
    display = (int) randomNum ;

} while (numberUsed [display - 1 ] );
In this code you are accessing some random index of array which might not even exist for example you have 25 as the random number while you have array of size 6 only so when you access numberUsed[25] you get this exception of IndexOutOfBounds

3 commentaires

Je ne sais pas vraiment comment résoudre ce problème? Je sais que la ligne est un problème, mais comment changerais-je pour le faire fonctionner


Si vous pouvez expliquer, qu'essayez-vous de réaliser avec ces deux personnes imbriquées et de faire des boucles, je peux vous aider à résoudre


J'essaie d'obtenir les numéros aléatoires jusqu'à ce que nous atteignions la quantité de chiffres des entrées utilisateur et de l'attribution de la plage de nombres à choisir et de vous assurer qu'aucun chiffre n'est identique. Désolé si cela n'a pas beaucoup d'informations, je suis toujours débutant.



1
votes

Dans votre cas, il semble que vous ayez besoin d'utiliser une matrice booléenne pour pouvoir valider le nombre généré n'a pas été généré auparavant, dans ce cas, il s'agit de la logique principale que vous aurez besoin.

public void lottery() {

    System.out.println("Welcome to the Lottery Number Generator!");
    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] lotteryNumberHasBeenGenerated = new boolean[highestNumber];

    for(int i=0;i<highestNumber;i++){ //none of the numbers have been   generated at this point
        lotteryNumberHasBeenGenerated[i]=false;
    }

    for (int i = 0; i < numsInLottery; i++) {
        int random;
        do{
            random=((Double)(Math.random() * highestNumber)).intValue();
        }while(lotteryNumberHasBeenGenerated[random]);

        lotteryNumbers[i] = random;
        lotteryNumberHasBeenGenerated[random]=true; //the number is maked as    generated

}

    System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));
}


20 commentaires

J'aimerais pouvoir utiliser un double tableau mais mon professeur dit que nous devons utiliser une matrice booléenne.


La chose est que vous n'avez pas besoin d'une matrice booléenne pour générer les chiffres, lui a-t-il précisé ce que le tableau doit être utilisé? ou c'était juste une exigence pour vous de l'utiliser?


Elle dit "d'utiliser une gamme booléenne des chiffres utilisés pour cela" comme une exigence.


@White_king me pardonne si c'est faux mais je pense que l'OP a mentionné que la matrice résultante ne devrait pas avoir de numéros en double, donc je suppose que la matrice booléenne est utilisée pour vérifier si un nombre a déjà été choisi ou non. Le processus devrait être> créer une matrice booléenne (même longueur que loterynumbers )> générer un nombre aléatoire (3 par exemple)> vérifier si boolean_array [3] est vrai < / Code> et régénérer le numéro, sinon définir boolean_area [3] sur vrai et continuer. Ce n'est certainement pas la meilleure façon d'accomplir de telles choses, mais je sais que la plupart des professeurs font cela lors de l'enseignement, y compris le mien.


Je spéculisais, mais qu'envoyez l'utilisation de la matrice booléenne pour vérifier les chiffres où générés @BrittanyGradford? En ce qui concerne la définition que vous proposez @ xamser7, cela a un peu de sens, effectivement plus que ma spéculation, est Xamster7 Spécification Ce que vous pensez que votre exigence @BittanyGradford?


Je suppose que c'est ce que mon professeur veut que je fasse aussi.


Donc, je ferais pour (int i = 0; i Cela garantit qu'il n'y a pas de chiffres en double.


@White_king Désolé, je ne sais pas comment le formater correctement, j'ai également oublié de mentionner mon erreur dans le commentaire précédent: loterynumbersaregenerated doit contenir hausse elumber éléments.


désolé, mais quelles lignes dois-je remplacer cela et y a-t-il d'autres lignes que je dois sortir


@BretanyGradford Voir ma réponse ci-dessous ...


@ Xamser7 Il est indiqué que les matrices ne peuvent pas être résolues.


Il m'a fallu beaucoup de temps à essayer d'optimiser le code des validations, il ne vaut pas la peine SRY, je ne pense pas qu'ils vous demanderont même cela, mais je devrais mentionner que l'algorithme a des problèmes lorsque les deux chiffres sont proches l'un à l'autre et surtout quand ils sont plus bas. n'a pas de validations négatives et beaucoup de choses: D donc je viens de le laisser tomber. La manière des simulons devrait fonctionner.


@BrittanyGradford J'ai essayé et ça marche bien pour moi, avez-vous utilisé mon code exact? Je devrais mentionner que j'ai utilisé une version assez ancienne de Java que moi, pour une raison quelconque, n'a pas mis à jour. Je ne sais pas si ce que je faisais devrait être fait différemment dans les versions plus récentes de Java, mais c'est plutôt improbable.


@ xamser7 oui j'ai utilisé le code exact. Savez-vous s'il y a quelque chose que je dois importer?


J'ai remarqué que vous et @white_king initialisez la matrice booléenne à FALSE. De ma compréhension, les types de données primitifs sont déjà initialisés par la JVM. Est-ce quelque chose qui a changé dans les versions Java plus récentes?


@BrittanyGradford utilisez-vous Eclipse? Cela pourrait avoir à voir avec ceci: Stackoverflow .Com / Questions / 45770661 / ... White_King a mis à jour son code, essayez de


Je suppose que @ xamser7


oh j'utilise Eclipse merci@ xamser7


@BrittanyGradford OK, je viens de réaliser que vous parliez de la classe classe. Je pensais que vous parliez du Boolean et int matris, mon mauvais. Oui, vous devez importer java.util.arrays . Vous savez, vous pouvez utiliser le raccourci Eclipse Ctrl + Maj + o pour importer toutes les classes requises.


Oui, vous venez de vous remercier, merci beaucoup @ xamser7 et white_king. Fonctionne parfaitement maintenant!



0
votes

Encore une fois, comme je l'ai déjà mentionné, je suppose que votre professeur veut que vous utilisiez un réseau booléen pour vérifier si un numéro généré au hasard existe déjà.

Un moyen d'accomplir cela consiste à créer un tableau de booléens ( IslotteryNumberDénerated Génerated code>) Lorsque chaque élément représente une indication de savoir si le numéro d'index de cet élément a été généré ou non (par exemple, si nous générons le nombre aléatoire 3, nous vérifions si islotterynumberDénerated [3] == vrai , true code> signifiant que le numéro 3 a déjà été généré (vice versa si false code>). Étant donné que la matrice booléenne doit être de taille le plus élevé + 1 code> Pour créer un index pour chaque numéro pouvant éventuellement être généré (à partir de 0 - grave) p>

Chaque fois que vous générez un nombre aléatoire pour l'élément i code> Dans le tableau CODE> LOTTERYNUMBers CODE> Vous devez vérifier si ce numéro a déjà été généré pour un autre latterynumbers code>. Dans le E code ci-dessous, j'utilise un do ... tandis que code> boucle qui itière jusqu'à ce qu'il génère un chiffre qui n'a pas été généré auparavant. P>

Utilisation de certains du code White_king de ci-dessus. . P>

public void lottery() {

    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] isLotteryNumberGenerated = new boolean[highestNumber + 1];

    for (int i = 0; i < numsInLottery; i++) { 
        do { 

            lotteryNumbers[i] = (int) (Math.random() * (highestNumber + 1)); 

        } while (isLotteryNumberGenerated[lotteryNumbers[i]]); 

        isLotteryNumberGenerated[lotteryNumbers[i]] = true; 

    }

   System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));

}


0 commentaires