Random bez powtórzeń na tablicach

0

Mam problem. Napisałem coś takiego ale niestety losuje z powtórzeniami... Jesli ktoś może mi powiedzieć gdzie jest błąd?
Zrobiłem na ArrayList i działa wszystko ładnie, jednak chciałbym to samo zrobić na tablicach.

 
package totolotek;

import java.util.Random;

public class Totolotek {

    public static void main(String[] args) {
    int[] a= new int[50];
    int[] b =new int [5];
    
    for(int i=1;i<a.length;i++)
    {
        a[i]=i;
        System.out.print(a[i]+" ");
    } 
   Random r=new Random();
   System.out.print("\n ");
   int index;
   for(int j=0; j<b.length; j++)
   { 
      index=r.nextInt(a.length);
      if(b[j]!=index);
        { 
        b[j]=index;
        System.out.print(b[j]+" ");
        }
      if(b[j]==index)
          r.nextInt(b.length);    
   }
   }  }
0

#Zrob zbior liczb od zakres_min do zakres_max.
#Przemieszaj ten zbior.
#Wez n liczb.

0

A czy nie da sie nic zrobić w instrukcjach sterujących ?

1

Ale rozumiesz, ze calosc to pare linijek? Nie wiem o co ci chodzi z instrukcjami sterujacymi...

    List<Integer> ints = IntStream.range(0, 50).boxed().collect(Collectors.toList());
    Collections.shuffle(ints);
    System.out.println(ints);
0

Dziękuję fajnie losuje, fajnie działa. Z tym że nie kapuje z tego nic.

Chodzi mi o mój kawałek kodu w którym poprzez instrukcje sterującą albo pętlę można jakoś zapisać do tablicy liczby które się nie powtarzają

   for(int j=0; j<b.length; j++)
   { 
      index=r.nextInt(a.length);
      if(b[j]!=index);
        { 
        b[j]=index;
        System.out.print(b[j]+" ");
        }
      if(b[j]==index)
          r.nextInt(b.length);    
   } 

Dzięki Tobie dowiedziałem się że można to zapisać w kilku linijkach dzięki za to, jednak chciałbym prosić o pomoc w rozwiązaniu tak jak ja próbowałem. pewnie coś źle zrobiłem i dlatego proszę mądrzejszych o pomoc.

0

Okej... sprobujemy inaczej:

    List<Integer> ints = new ArrayList<Integer>();
    for(int i = 0; i < 50; i++) {
      ints.add(i);
    }

    Collections.shuffle(ints);
    System.out.println(ints);

Ten kod juz wyglada bardziej znajomo?

jednak chciałbym prosić o pomoc w rozwiązaniu tak jak ja próbowałem

Rozwiazaniem jest uzycie Collections.shuffle() i sprawdzenie przez ciebie w dokumentacji co robi, oraz zrozumienie tego. Jesli to bedzie z glowy, to sam wrocisz do swojego rozwiazania i zaimplementujesz je w poprawny sposob, niekoniecznie uzywajac Collections.shuffle(), dla sportu.

0

Powinno być:

if (b[j] != index)
{
   b[j] = index;
   System.out.print(b[j] + " ");
}

a jest

if (b[j] != index);
{
   b[j] = index;
(...)
}

czyli musisz usunąć średnik po ifie.

Możesz też zamiast

System.out.print("\n ");

użyć

System.out.println();

a jeśli chcesz żeby się liczby w b nie powtarzały, musisz sprawdzić, czy taka liczba się już tam znajduje - można w zagnieżdżonym forze lub użyć do tego np. HashSet.

0

Dzięki n0Name na pewno skorzystam i jutro popatrzę co i jak :)

lordbobstein czy jestes w stanie pomoc mi z tym zagnieżdżonym for?

1

Może tak:

        int index;
        boolean exists;
        for (int j = 0; j < b.length; j++)
        {
            exists = false;
            index = r.nextInt(a.length);

            for (int i = 0; i < b.length; i++)
            {
                if (b[i] == index)
                {
                    exists = true;
                    break;
                }
            }
            
            if (exists == false)
            {
                b[j] = index;
                System.out.print(b[j] + " ");
            }
            else
            {
                j -= 1;
            }
        }
0

Chyba nie o to chodzi pytającemu. Wydaje mi się, że chce stworzyć określony zbiór z LOSOWO generowanych niepowtarzających się elementów. W takiej sytuacji:

import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Set;

public class RandomNumbers {
     public static void main(String[] args) {
          int sizeOfArrayYouNeed = 5;
          int maxValue = 5;

          Random random = new Random();
          Set<Integer> elements = new LinkedHashSet<Integer>();
          while (elements.size() < sizeOfArrayYouNeed) {
               Integer nextInteger = random.nextInt(maxValue) + 1;
               elements.add(nextInteger);
          }
          
          for (int i : elements) {
               System.out.println(i);
          }
     }
}
0

**lordbobstein ** Dziękuję o to chodzi. Próbowałem z boolean ale niestety mi nie wychodziło.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.