Permalänk
Medlem

Java - Unika random integers?

Hallo!

Detta är en kortlek. Jag vet koden är hemsk, men fortsätter på detta och börjar om sen när jag har fixat det. Hatar att ge upp.

int X = (int)(Math.random()*52)+1;

if(X==0){("blabla);} else if(X==1){("blabla");} else if(X==2){("blabla");} ..... else if(X==51){("blabla");} else{("blabla");}

Men jag vill att den ska bara kunna randoma ett tal 1 gång, alltså unikt.

Någon som kan hjälpa mig? Tack på förhand.

Permalänk
Medlem

Skapa en array med 52 platser som räknar upp från 1 till 52. Shuffla (http://www.exampledepot.com/egs/java.util/coll_Shuffle.html) sedan arrayen och plocka sen värden en efter en.

Permalänk
Medlem
Skrivet av iXam:

Skapa en array med 52 platser som räknar upp från 1 till 52. Shuffla (http://www.exampledepot.com/egs/java.util/coll_Shuffle.html) sedan arrayen och plocka sen värden en efter en.

incomparable types: java.util.ArrayList and int

Den verkar inte vilja jämföra Arrayens värde med if satsens vilkor. Som i detta fallet är en int.

Permalänk
Medlem
Skrivet av Lindgren92:

Men jag vill att den ska bara kunna randoma ett tal 1 gång, alltså unikt.
Någon som kan hjälpa mig? Tack på förhand.

Det där borde duga som random. Kör man Math.Random() utan seed så använder den current time.
Vill du ha ännu mer unika slumptal kan det vara värt att kolla på http://en.wikipedia.org/wiki/Mersenne_twister . Python använder den som standard men borde finnas någon library man kan ladda ner till Java för att använda det.

EDIT: Kan vara så att jag helt missuppfattar frågan.

Permalänk
Medlem
Skrivet av Gnejs:

Han har som sagt inget behov av random då han försöker skapa en kortlek som har förutbestämda värden (1-52), enda som behövs är att blanda den, som iXam sagt.

TS: Om du inte klarar av att använda en arraylist så bör du nog ta och spendera några dagar på att lära dig det mesta grundläggande inom Java innan du kommer hit och stället frågor nivån "incomparable types: java.util.ArrayList and int". Felmeddelandet säger precis vad som är fel. -.-

Jo men vi har haft java 2 veckor nu i skolan. Detta är första gången vi använder arrayer. Vi har inte ens gått igenom det. Och ja jag förstår vad felmeddelandet betyder och vad som behövs göras, men vet inte hur.

Permalänk
Medlem
Skrivet av Lindgren92:

Jo men vi har haft java 2 veckor nu i skolan. Detta är första gången vi använder arrayer. Vi har inte ens gått igenom det. Och ja jag förstår vad felmeddelandet betyder och vad som behövs göras, men vet inte hur.

Du försöker att jämföra en vektor, eller snarare en arrayList, med ett heltal. Du måste först plocka ur det aktuella värdet UR arraylisten och sedan jämföra int mot int.

En annan idée kan vara att fylla en stack med tal och efter 52st pop så är stacken tom alt. ha en flagga för när kortet är draget och isf försöka en gång till eller något.

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Medlem
Skrivet av Lindgren92:

Jo men vi har haft java 2 veckor nu i skolan. Detta är första gången vi använder arrayer. Vi har inte ens gått igenom det. Och ja jag förstår vad felmeddelandet betyder och vad som behövs göras, men vet inte hur.

Om du talar om vad som behöver göras (som du påstår dig veta) så talar jag om hur man gör det

(glöm inte att citera för svar)

Permalänk
Medlem
Skrivet av MrMadMan:

Om du talar om vad som behöver göras (som du påstår dig veta) så talar jag om hur man gör det

(glöm inte att citera för svar)

Jag har t.om. provat

ArrayList<Integer> D1 = new ArrayList<Integer>();

Men den kan fortfarande inte jämföra ArrayList<Integer> med int.

Permalänk
Medlem
Skrivet av Lindgren92:

Jag har t.om. provat

ArrayList<Integer> D1 = new ArrayList<Integer>();

Men den kan fortfarande inte jämföra ArrayList<Integer> med int.

Om vi bortser från autoboxing osv och vi säger att du vill jämföra int i med något i arraylist..

int i =5;
if(D1.get(0)==i)syso("WOHO EN FEMMA!!");

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Medlem

Off topic så kan jag ge dig ett riktigt snabbt tips som kommer antingen göra dig helt godlike på programering eller lite upprörd.. Så ta det med en nypa salt!

Datavetenskap( och by extension programmering) är på gott och ont en matematisk disciplin. Programspråken är baserade på matematik och de operationer du kan göra är praktiskt taget matematiska, trots att några hippies lyckades att bli RIKA på 70-80 talet.

Så vad du ska ta ur detta är att ta din tid, rita och tänk innan du börjar hacka och ta del av all information din lärare, din ide och hemsidor ger dig så kommer du lösa problem 98% snabbare

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Medlem
Skrivet av Bbirger:

Off topic så kan jag ge dig ett riktigt snabbt tips som kommer antingen göra dig helt godlike på programering eller lite upprörd.. Så ta det med en nypa salt!

Datavetenskap( och by extension programmering) är på gott och ont en matematisk disciplin. Programspråken är baserade på matematik och de operationer du kan göra är praktiskt taget matematiska, trots att några hippies lyckades att bli RIKA på 70-80 talet.

Så vad du ska ta ur detta är att ta din tid, rita och tänk innan du börjar hacka och ta del av all information din lärare, din ide och hemsidor ger dig så kommer du lösa problem 98% snabbare

Datavetenskap har en stor portion matematik i sig JA. Men högnivåprogrammering (som Java oftast associeras med) handlar betydligt mycket mer om design och arkitektur än om matematik.

Man behöver alltså inte vara någon stjärna på matematik för att bli en bra programmerare.

Permalänk
Medlem
Skrivet av Bbirger:

Om vi bortser från autoboxing osv och vi säger att du vill jämföra int i med något i arraylist..

int i =5;
if(D1.get(0)==i)syso("WOHO EN FEMMA!!");

Jo men där har du ju precis skapat en int(i). Då går det jämföra med D1==0. Men det går inte forf inte om de ligger i en Arraylist. Eller List. Eller missförstår jag dig?

Permalänk
Medlem
Skrivet av MrMadMan:

Datavetenskap har en stor portion matematik i sig JA. Men högnivåprogrammering (som Java oftast associeras med) handlar betydligt mycket mer om design och arkitektur än om matematik.

Man behöver alltså inte vara någon stjärna på matematik för att bli en bra programmerare.

Precis, men försökte belysa att man måste bruka en viss del noggrannhet och tänk, få saker kommer bara genom att man trycker ner tangenterna

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Medlem
Skrivet av Lindgren92:

Jo men där har du ju precis skapat en int(i). Då går det jämföra med D1==0. Men det går inte forf inte om de ligger i en Arraylist. Eller List. Eller missförstår jag dig?

Jag skapade Int i bara för att visa.. Den aktuella int'en som spelar roll i ditt fall är den D1.get(index) retunerar.

en lätt lösning med lagom mkt tänk och rätt pedagogisk för detta problemet på den här nivån är:
*Skit i vad ArrayList är, det gör dig inget gott att inte veta hur en vektor är och bara använda ett skyddsskal runt den..
*Googla vad en vektor är i java
*Läs suns codingstyle och använd INTE namn som "D1"
*Skapa två vektorer, båda 52 långa
*Läs på vad Random klassen är
*Fyll den ena vektorn med 0'or
*Kör en loop tills du känner dig nöjd och vid varje varv så slumpar du ett tal Random rand = new Random(); rand.nextInt(52);
och tittar om den finns i din ena vektor(den med bara 0or) finns den testa igen, finns den inte lägg in den i din andra vektor och sen sätt en etta där du la den i din första vektor..

Hoppas att det är lite luddigt för dig så att du får lite att fylla i själv, men på din nästa uppgift försök tänka i de här stegen

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Medlem
Skrivet av Bbirger:

Jag skapade Int i bara för att visa.. Den aktuella int'en som spelar roll i ditt fall är den D1.get(index) retunerar

Ok. Då är jag med. Tack för din hjälp.

Roligt och se att andra har tydligen föds med förmågan att programmera Java. Måste varit skönt och aldrig ha varit en nybörjare? Grattis i alla fall.

Permalänk
Medlem
Skrivet av Lindgren92:

incomparable types: java.util.ArrayList and int

Den verkar inte vilja jämföra Arrayens värde med if satsens vilkor. Som i detta fallet är en int.

Aja baja, inte jämföra äpplen och päron!

Som redan har sagts så gör du dig själv en stor tjänst om du läser på om arrayer först. Då kommer du begripa vad problemet beror på, och det är ett mycket bra sätt att lära sig något (alltså genom att själv komma till insikt, istället för att bara memorera något som någon annan sagt).

Visa signatur

5950X, 3090

Permalänk
Medlem
Skrivet av Lindgren92:

Ok. Då är jag med. Tack för din hjälp.

Roligt och se att andra har tydligen föds med förmågan att programmera Java. Måste varit skönt och aldrig ha varit en nybörjare? Grattis i alla fall.

Du kommer säkert bli precis lika irriterad nästa gång du försöker hjälpa till någon nybörjare Nu ska jag sluta DDosa din tråd och kom bara ihåg att ta det lugnt och tänka i logiska steg och läsa på de luckor som finns så grejjar det sig

Visa signatur

2500k @ 4.7GHz | VENGEANCE CL8 1600Mhz | 6970 @ stock | Agi 3 ssd- 120gb + slö 1 tb disk

Permalänk
Inaktiv

Vill du göra det lättare för dig så använder du en kö istället för en array. Då kan du shuffla den och bara hämta nästa element

Queue<Integer> q = new Queue<Integer>(); for(i = 1; i <= 52; i++){ q.put(i); } Collections.shuffle(q); //hämta ett unikt slumptal mellan 1 och 52 q.poll();

Permalänk
Medlem

Lade för skojs skull in en timer för att se hur lång tid det tog från start till stop. Det verkade inte vara allt för tids förödande.

Medvetet skitit i att kommentera koden. Du får läsa och lära

public class DoItAll { int shuffleCard; int[] cards = new int[51]; int arrayIndex = 0; boolean exists; long start; public void shuffle(){ start = System.currentTimeMillis(); exists = false; while(arrayIndex<51){ shuffleCard = (int) ((Math.random()*52)+1); for(int i = 0; i <= arrayIndex; i++){ if(cards[i] == shuffleCard){ exists = true; } } if(!exists){ cards[arrayIndex] = shuffleCard; arrayIndex++; } exists = false; } for (int i = 0;i<51;i++){ System.out.println(cards[i]); } System.out.println("\n" + (System.currentTimeMillis() - start)); } public static void main(String[] args){ DoItAll dia = new DoItAll(); dia.shuffle(); } }

Dold text
Visa signatur

Gaming: Epenis ++
Everything else: MacBook Air M1
Work: MBP M1

Permalänk
Medlem
Skrivet av Uibi:

Lade för skojs skull in en timer för att se hur lång tid det tog från start till stop. Det verkade inte vara allt för tids förödande.

Medvetet skitit i att kommentera koden. Du får läsa och lära

public class DoItAll { int shuffleCard; int[] cards = new int[51]; int arrayIndex = 0; boolean exists; long start; public void shuffle(){ start = System.currentTimeMillis(); exists = false; while(arrayIndex<51){ shuffleCard = (int) ((Math.random()*52)+1); for(int i = 0; i <= arrayIndex; i++){ if(cards[i] == shuffleCard){ exists = true; } } if(!exists){ cards[arrayIndex] = shuffleCard; arrayIndex++; } exists = false; } for (int i = 0;i<51;i++){ System.out.println(cards[i]); } System.out.println("\n" + (System.currentTimeMillis() - start)); } public static void main(String[] args){ DoItAll dia = new DoItAll(); dia.shuffle(); } }

Dold text

Herregud.. -_-

Jag har också jobbat för Elan förresten. Tjo!

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Datavetare

Här är ett program som, utan att använda arrayer eller listor, går igenom alla nummer från 1 till 52. Denna är även garanterad att terminera

class Jshuffle { final int numElem = 52; long usedNums; private int rndToNum(int rnd) { long num = 0; do { while (0 != (this.usedNums & (1l << ++num))); } while (rnd-- > 0); this.usedNums |= (1l << num); return (int)num; } void shuffle() { this.usedNums = 0; for (int roundsLeft = numElem; roundsLeft > 0; roundsLeft--) { int rnd = (int) (Math.random() * roundsLeft); System.out.println(rndToNum(rnd)); } } public static void main(String[] args) { new Jshuffle().shuffle(); } }

Dold text
Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Här är ett program som, utan att använda arrayer eller listor, går igenom alla nummer från 1 till 52. Denna är även garanterad att terminera

class Jshuffle { final int numElem = 52; long usedNums; private int rndToNum(int rnd) { long num = 0; do { while (0 != (this.usedNums & (1l << ++num))); } while (rnd-- > 0); this.usedNums |= (1l << num); return (int)num; } void shuffle() { this.usedNums = 0; for (int roundsLeft = numElem; roundsLeft > 0; roundsLeft--) { int rnd = (int) (Math.random() * roundsLeft); System.out.println(rndToNum(rnd)); } } public static void main(String[] args) { new Jshuffle().shuffle(); } }

Dold text

Du har programmerat för mycket i c/c++ virtual void, men det framgår ju av ditt namn!

Skickades från m.sweclockers.com

Permalänk
Medlem

skapa en arraylist med värdena 1 - 52. Kör random från 1 till maxlängden av arraylisten och plocka det värde som du får från platsen. När du plockat ett värde ska du ta bort den ur arraylisten. När arraylisten är tom så är alla kort slut. glhf

Permalänk
Datavetare
Skrivet av RenderMonkey:

Du har programmerat för mycket i c/c++ virtual void, men det framgår ju av ditt namn!

Skickades från m.sweclockers.com

Kan hålla med om att det var något en C-programmera skulle skrivit, men jag skulle gjort det annorlunda om nu kraven inte var som de var...
Det var definitivt inte C++, i alla fall inte modern C++. Så här skulle jag löst uppgiften i i det språket

std::vector<int> cards(52); std::iota(begin(cards), end(cards), 1); std::random_shuffle(begin(cards), end(cards));

Rätt enkelt va?

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Jag hade gjort på följande sätt:

Skapa en kort klass som består av två enum metoder Value och Card, där value håller färg och card ess - kung.
Sedan skapa en konstruktor bestående av dessa två.

Därefter skapa en kortlek klass och skapa en arraylist av typen <kort> och där gör man en kortlek genom att för varje Value på kort så lägger man till ess - kung i listan.

Sen skapa en metod shuffle som sorterar kortleken. Även göra en metod drawCard som gör att man kan dela ut ett antal kort.

public class Kort { public enum Value{ Hjärter, Spader, Ruter, Klöver } public enum Card{ Ess, Två, Tre, Fyra, Fem, Sex, Sju, åtta, Nio, Tio, Knekt, Dam, Kung; } public Value value; public Card card; public Kort(Value v, Card c){ value = v; card = c; } }

public class Kortlek { private ArrayList<Kort> kortlek = new ArrayList<Kort>(); public Kortlek(){ for(Value v : Value.values()){ for(Card c : Card.values()) kortlek.add(new Kort(v,c)); } } public void drawCard(int n){ if(n >= 1 && n <= 52){ System.out.println("Utdelade kort:"); for(int a=0; a<n; a++) System.out.println(kortlek.get(a).toString()); for(int b=0; b<n; b++) kortlek.remove(0); System.out.println("Det finns " + kortlek.size() + " kort kvar i kortleken."); } else System.err.println("Du kan inte dela ut mer än 52 kort"); } public void shuffle(){ if(kortlek.size() == 52) Collections.shuffle(kortlek); else System.err.println("Du får inte blanda nu!"); } }

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk
Medlem

Dubbel post..

Visa signatur

"This is VAR, spelled A-U-T-O"