losowanie bez powtórzeń

0

witam, jak zmienić ten kod aby nie powtarzało liczb?

 import java.util.Scanner;
import java.util.Arrays;
public class SymulatorLottomatu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int licznik=0;
int[] tab = new int[6];
do{
	int liczba = (int)(Math.random()*49+1);
	tab[licznik] = liczba;
	licznik++;
}while(licznik<6);

for(int wynik : tab)
	 System.out.println(wynik + " ");
}
}	
1

#Wygeneruj zbiór liczb od zakres_min do zakres_max.
#Pomieszaj te liczby.
#Wypisz N pierwszych.

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		ArrayList<Integer> numbers = new ArrayList<>();
		for(int i = 1; i < 50; ++i) {
			numbers.add(i);
		}
		
		Collections.shuffle(numbers);
		
		for(int i = 0; i < 6; ++i) {
			System.out.println(numbers.get(i));
		}
	}
}
0

Musi być tablica? Może użyj Set, wtedy nawet jeśli wylosujesz taką samą to nie doda duplikatu. Np. coś takiego:

		Set<Integer> numbers = new HashSet<Integer>();
		int count = 6;

		while (numbers.size() < count) {
			numbers.add((int) (Math.random() * 49 + 1));
		}
		
		System.out.println("Wylosowane liczby");
		for(Integer number : numbers) {
			System.out.print(number + " ");
		} 
0

Dopisz sobie sprawdzenie po wylosowaniu czy już masz taką liczbę, jeżeli nie to zapisz do tablicy, jeżeli tak to losuj jeszcze raz.
Tu masz gotowca :)
Losowanie bez powtórzeń

0

@karolinaa, to co wrzuciłaś w komentarzu jest najprostszym i najlepszym rozwiązaniem dla ograniczonego zbioru liczb całkowitych. Każde podejście w stylu "wylosuj, sprawdź i jak już jest wylosuj ponownie" jest mało wydajne.

0

Rozwiązanie i chyba bardzo popularne (algorytm):
http://www.lifeincode.net/programming/leetcode-next-permutation-java/

0

Witam,

mam problem z Collections.shuffle();, mam taki fragment kodu, który przy którym do... while... nie działa i nie wiem dlaczego:

Integer[] zmienne = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		do {
		Collections.shuffle(Arrays.asList(zmienne));
		
		zOne = zmienne[0];
		zTwo = zmienne[1];
		zThree = zmienne[2];
		zFour = zmienne[3];
		zFive = zmienne[4];
		zSix = zmienne[5];
		zSeven = zmienne[6];
		zEight = zmienne[7];
		zNine = zmienne[8];
		zTen = zmienne[9];
			
		} while (zOne==1 && zTwo==2 && zThree ==3);	

Chyba, że jest jakaś inna opcja wylosowania cyfr 0-9 do w.w. int? Math.random raczej nie wchodzi w grę, chyba, że nie ma innego wyjścia :P

Pozdrawiam!

1

Jaki jest cel programu? Taki, że w momencie gdy zOne będzie równe 1, zTwo równe 2 a zThree równe 3 to wychodzimy z pętli i już nie mieszamy? Jeśli tak to zmień warunek na:

while (!(zOne == 1) || !(zTwo == 2) || !(zThree == 3));

Czy cel jest przeciwny i mieszamy dopóki zOne równe 1, zTwo równe 2 i zThree równe 3. Wtedy twój warunek jest jak najbardziej ok.

Zamiast inicjalizacji tablicy możesz użyć javy 8:

IntStream.rangeClosed(1, 10).toArray();
0

W ramach świąt prezentuje mój najnowszy program wypisujący 6 unikalnych liczb z przedziału 1 do 49. Ma on złożoność nieskończoność do sześcianu. Siedze już pół godziny i czekam aż program wypisze te 6 liczb i ciągle nic, ale Java wymaga cierpliwości.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

class Lotto {
	static boolean x = false;

	public static void main(String[] args) {
		ArrayList<Integer> arrlist = new ArrayList<>();
		HashSet<Integer> hash = new HashSet<>();

		while (x != true) {

			for (int i = 1; i < 50; ++i)
				arrlist.add((int) (Math.random() * 49) + 1);

			for (int s : arrlist)
				hash.add(s);
			
			if (hash.size() < 49) {
				arrlist.clear();
				hash.clear();
			} else
				x = true;
		}
		
		Integer[] tab = {};
		tab = hash.toArray(tab);
		ArrayList<Integer> arrlist2 = new ArrayList<>();
		Collections.addAll(arrlist2, tab);
		Collections.shuffle(arrlist2);
		List<Integer> sub = arrlist2.subList(1, 7);
		System.out.println(sub);

	}
}

0

Witam,

szukam generatora liczb działającego jak.. licznik/stoper ale z pewnymi ograniczeniami. Piszę program, który rozwiązuje równania matematyczne, w których pod niewiadome podkłada różne cyfry (0-9). Próbowałem już kilku metod generowania liczb (Math.random/Collections.shuffle), i do krótkich równań, z max 5 niewiadomymi, działają. Jednak przy większej ilości traci to sens, po prostu program liczy, liczy i się nie może doliczyć :P

  1. Generowanie tylu cyfr jak długi jest string:
String EqOne = ABCD;
for (int i=3;i=EqOne.length();i++){
int[] zmienne = new int [i]
}

(pewnie nawet w tych 4 linijkach zrobiłem jakiś błąd :P)
2. Wygenerowane cyfry zapisane w tablicy, aby ich wartości mógł w prosty sposób "wyciągnąć":

int zOne = zmienne[0];
int zTwo = zmienne[1];
//itd.
  1. Generowanie cyfr 0-9 i NIE MOGĄ się powtarzać, czyli np:
zmienne = {0, 1, 2};
zmienne = {1, 0, 9};
zmienne = {3, 1, 5};
  1. Generowanie liczb rosnąco, czyli 0,1,2; 0,1,3;...;1,0,2; 1,0,3;...; 9,8,7;

Pozdrawiam!

ps. kombinuję z czymś takim:

int a, b, c, zOne, zTwo, zThree;
		for ( a = 0; a<10; a++){
			for ( b= 0; b<10; b++){
				for ( c=0; c<10;c++){
					
zOne = a;
zTwo = b;
zThree = c;
	
				}
			}
		}

I oczywiście są generowane cyfry takie jak potrzebuję, ale widzę tutaj przynajmniej 3 problemy

  1. Cyfry się powtarzają (czyli jest zwykłe liczenie od 000 do 999)
  2. Nie wiem jak zatrzymać odliczanie w momencie kiedy zostanie znaleziona odpowiedź (np. abc=126, czyli np a=2, b=7, c=9)
  3. Mógłbym użyć takiej składanki do każdej opcji (czyli gdy string będzie równy 3, to wtedy 3x FOR, 4 - 4xFOR, itd), ale to trochę kiepskie rozwiązanie.

ps2. Problem 1 (powtarzające się cyfry) rozwiązany ;)

int a, b, c;
		for ( a = 0; a<10; a++){
			for ( b= 0; b<10; b++){
				for ( c=0; c<10;c++){
					
					if (a==b)continue;
					if (a==b)break;
					
					if (a==c)continue;
					if (a==c)break;
					
					if (c==b)continue;
					if (c==b)break;
	
		
		int zOne = a;
		int zTwo = b;
		int zThree = c;
		
		
		System.out.println("a = " + zOne);
		System.out.println("b = " + zTwo);
		System.out.println("c = " + zThree);

			
				}
			}
		}

1 użytkowników online, w tym zalogowanych: 0, gości: 1