RullaTärning (hjälp med programmering)

Permalänk
Medlem

RullaTärning (hjälp med programmering)

Hej,

Behöver hjälp med nedan program. Väljer jag t.ex rulla 2 tärningar sedan väljer menyval 2 så kommer det ut 2 st tärningar med samma värde. Får inte riktigt till det med slumpvalda nr. Var är det det felar?

Tacksam för tips.

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; } static void Main() { Random slump = new Random(); List<int> tärningar = new List<int>(); Console.WriteLine("\n\tVälkommen till tärningsgeneratorn!"); bool kör = true; while (kör) { Console.WriteLine("\n\t[1] Rulla tärning\n" + "\t[2] Kolla vad du rullade\n" + "\t[3] Avsluta"); Console.Write("\tVälj: "); int val; int.TryParse(Console.ReadLine(), out val); switch (val) { case 1: Console.Write("\n\tHur många tärningar vill du rulla: "); bool inmatning = int.TryParse(Console.ReadLine(), out int antal); if (inmatning) { for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); } } break; case 2: Console.WriteLine("\n\tRullade tärningar: "); foreach (int tärning in tärningar) { Console.WriteLine("\t" + tärning); } break; case 3: Console.WriteLine("\n\tTack för att du rullade tärning!"); System.Threading.Thread.Sleep(1000); kör = false; break; default: Console.WriteLine("\n\tVälj 1-3 från menyn."); break; }

§3.1 /moderator
Permalänk
Medlem

Random är en så kalla pseudo-slumptalsgenerator, d.v.s. den är egentligen inte äkta slumpmässig utan räknar fram tal med en algoritm som ser slumpmässiga ut. Algoritmen som Random använder behöver ett så kallat seed-värde, ett värde som används för att starta algoritmen. Skapar man flera Random-objekt med samma seed så kommer man få samma följd av slumptal.

Problemet här är att när man skapar ett Random-objekt utan något argument så används något värde som beror på tiden som seed, t.ex. systemets tid i millisekunder eller nåt. Eftersom du anropar RullaTärning flera gånger direkt efter varandra och skapar ett nytt Random-objekt varje gång så hinner troligtvis inte tillräckligt med tid gå mellan anropen, så du får samma seed varje gång. Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); }

Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Permalänk
Medlem
Skrivet av micke_mj:

Hej,

Behöver hjälp med nedan program. Väljer jag t.ex rulla 2 tärningar sedan väljer menyval 2 så kommer det ut 2 st tärningar med samma värde. Får inte riktigt till det med slumpvalda nr. Var är det det felar?

Tacksam för tips.

List<int> tärningar = new List<int>();

Hur kan det där ens kompilera?
Det går inte att använda primitiva typer som int med generics. Du måste använda wrapper-typen Integer i så fall. Dessutom är List ett interface och kan således inte instansieras, du måste använda någon implementation av det som exempelvis ArrayList.

List<Integer> tärningar = new ArrayList<Integer>();

Permalänk
Medlem
Skrivet av MrDoggo:

Hur kan det där ens kompilera?
Det går inte att använda primitiva typer som int med generics. Du måste använda wrapper-typen Integer i så fall. Dessutom är List ett interface och kan således inte instansieras, du måste använda någon implementation av det som exempelvis ArrayList.

List<Integer> tärningar = new ArrayList<Integer>();

List<int> list = new List<int>();
fungerar utmärkt i C#

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem
Skrivet av AJL:

List<int> list = new List<int>();
fungerar utmärkt i C#

Oj såg inte att det var C#, var syntaktiskt så likt. Fånig jag kände mig nu, måste blandat ihop med Javatråden. Så blir det när man inte ser sharp.

Permalänk
Medlem
Skrivet av perost:

Random är en så kalla pseudo-slumptalsgenerator, d.v.s. den är egentligen inte äkta slumpmässig utan räknar fram tal med en algoritm som ser slumpmässiga ut. Algoritmen som Random använder behöver ett så kallat seed-värde, ett värde som används för att starta algoritmen. Skapar man flera Random-objekt med samma seed så kommer man få samma följd av slumptal.

Problemet här är att när man skapar ett Random-objekt utan något argument så används något värde som beror på tiden som seed, t.ex. systemets tid i millisekunder eller nåt. Eftersom du anropar RullaTärning flera gånger direkt efter varandra och skapar ett nytt Random-objekt varje gång så hinner troligtvis inte tillräckligt med tid gå mellan anropen, så du får samma seed varje gång. Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++) { RullaTärning(slump); tärningar.Add(RullaTärning(slump)); }

Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Så lösningen kan vara=)?

Permalänk
Medlem

Letar o letar men vet ej vad som behövs göras, tacksam för hjälp!

Permalänk
Medlem
Skrivet av micke_mj:

Så lösningen kan vara=)?

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

Permalänk
Medlem
Skrivet av perost:

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

Mycket medveten, men vad innebär? Är VÄLDIGT GRÖN.

Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++)
{
RullaTärning(slump);
tärningar.Add(RullaTärning(slump));
}
Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

Permalänk
Medlem
Skrivet av micke_mj:

Mycket medveten, men vad innebär? Är VÄLDIGT GRÖN.

Lösningen är att skapa ett Random-objekt och använda det överallt istället för att skapa ett nytt objekt varje gång du behöver ett slumptal.

I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället. I din kod har du även:

for (int i = 0; i < antal; i++)
{
RullaTärning(slump);
tärningar.Add(RullaTärning(slump));
}
Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet.

SKall oxå nämnas att for loopen måste användas på ovan sätt enligt Lärare.

Permalänk
Medlem
Skrivet av perost:

Mitt inlägg innehåller en mening som börjar med "lösningen är ..."

har nog läst ditt inlägg 45 ggr.

Permalänk
Medlem

Efter 12år som systemutvecklare blir jag fortfarande lika förbannad när man namnger metoder, funktioner, klasser etc på svenska........

Sorry att jag är OT.

Permalänk
Medlem
Skrivet av gonace:

Efter 12år som systemutvecklare blir jag fortfarande lika förbannad när man namnger metoder, funktioner, klasser etc på svenska........

Sorry att jag är OT.

12 år som utvecklare kanske du har några tips;) förutom språket

Permalänk
Medlem

@micke_mj
Du måste nog gå igenom din kod lite och fundera över vad alla delar faktiskt gör och vad du tänkt att de ska göra. Har du skrivit programmet själv? För att döma av dina kommentarer känns det lite som att du bara skrivit av/kopierat och sedan inte kunnat se problemen.

@perost pekar ut problemen väldigt tydligt.
"I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället."

Så vad menas med att du skickar in ett objekt men ignorerar det och skapar ett nytt?

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; }

Din funktion tar in ett Random-objekt som du döper till "slumpObjekt", men du använder det aldrig. Istället skapar du upp ett nytt objekt genom:

Random random = new Random();

Som du sedan använder på raden efter. Vad händer om du tar bort denna bit kod och på raden efter använder objektet som du skickar in (slumpObjekt)?

"Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet."

for (int i = 0; i < antal; i++) { RullaTärning(slump); // Ett anrop till RullaTärning tärningar.Add(RullaTärning(slump)); // Här i anropas RullaTärning igen }

Så perost säger alltså att du anropar funktionen RullaTärning utan att den gör någonting för att du inte sparar resultatet. Själva funktionen skapar ju faktiskt ett ett nytt random-objekt, slumpar fram ett tal och skickar tillbaka det. Men eftersom du inte sparar ned resultatet, utan bara anropar funktionen så gör den ingen nytta. Du säger alltså: Skicka tillbaka ett resultat till mig som jag inte tänker använda. Jämför det med ditt andra anropp, vad händer där? Jo du rullar din tärning, skickar tillbaka resultatet och använder det genom att lägga till det i din lista genom täningar.Add().

Permalänk
Medlem
Skrivet av noyce:

@micke_mj
Du måste nog gå igenom din kod lite och fundera över vad alla delar faktiskt gör och vad du tänkt att de ska göra. Har du skrivit programmet själv? För att döma av dina kommentarer känns det lite som att du bara skrivit av/kopierat och sedan inte kunnat se problemen.

@perost pekar ut problemen väldigt tydligt.
"I din kod så skickar du faktiskt in ett Random-objekt till din RullaTärning-funktion, men du ignorerar det och skapar ett nytt objekt som du använder istället."

Så vad menas med att du skickar in ett objekt men ignorerar det och skapar ett nytt?

static int RullaTärning(Random slumpObjekt) { Random random = new Random(); int dice = random.Next(1, 6); return dice; }

Din funktion tar in ett Random-objekt som du döper till "slumpObjekt", men du använder det aldrig. Istället skapar du upp ett nytt objekt genom:

Random random = new Random();

Som du sedan använder på raden efter. Vad händer om du tar bort denna bit kod och på raden efter använder objektet som du skickar in (slumpObjekt)?

"Det första anropet till RullaTärning gör ingenting eftersom du inte sparar resultatet."

for (int i = 0; i < antal; i++) { RullaTärning(slump); // Ett anrop till RullaTärning tärningar.Add(RullaTärning(slump)); // Här i anropas RullaTärning igen }

Så perost säger alltså att du anropar funktionen RullaTärning utan att den gör någonting för att du inte sparar resultatet. Själva funktionen skapar ju faktiskt ett ett nytt random-objekt, slumpar fram ett tal och skickar tillbaka det. Men eftersom du inte sparar ned resultatet, utan bara anropar funktionen så gör den ingen nytta. Du säger alltså: Skicka tillbaka ett resultat till mig som jag inte tänker använda. Jämför det med ditt andra anropp, vad händer där? Jo du rullar din tärning, skickar tillbaka resultatet och använder det genom att lägga till det i din lista genom täningar.Add().

Uppskattar din förklaring väldigt mkt, pedagogiskt, tack!

Permalänk

Har du klarat RullaTärning

Hej!
Har du klarat RullaTärning?

Permalänk
Medlem
Skrivet av afram94:

jag vill ha hjälp med den här också

Gör en egen tråd där du skriver vad du gjort hittils och vad du provat / behöver ha hjälp med.
Dumt att bumpa en 2 år gammal tråd

Permalänk
Medlem
Skrivet av zaibuf:

Gör en egen tråd där du skriver vad du gjort hittils och vad du provat / behöver ha hjälp med.
Dumt att bumpa en 2 år gammal tråd

Skulle också behöva hjälp med denna.
Varför skapa en ny tråd? Uppgiften vi har är fortfarande identisk med denna och samma problem som behöver lösas.

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Keeper of Traditions
Skrivet av kevvz0r:

Skulle också behöva hjälp med denna.
Varför skapa en ny tråd? Uppgiften vi har är fortfarande identisk med denna och samma problem som behöver lösas.

Har du identisk kod också så kan du väl använda samma tips som TS fick?

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Dunder:

Har du identisk kod också så kan du väl använda samma tips som TS fick?

Det var tack vare föregående svar jag hittade lösningen.
Problem nr 2 är att man ska få fram ett medelvärde från rullade tärningar. Alltså få fram värden sparade i list och dela dem på antal tärningar rullade. Han bara kika påt en snabbis men ska fortsätta så fort jag är hemma igen.

Skickades från m.sweclockers.com

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk

using System; using System.Collections.Generic; using System.Threading; // fick lägga till dessa kataloger för att sortera vektorerna namespace ConsoleApp3 { class Program { // detta är en statisk metod med en int som ett returvärde // metoden tar en parameter i form av ett random objekt av // randomklassen static int RullaTärning(Random slumpObjekt) { // här ska du skapa kod som slumpar fram ett tal // mellan 1 och 6, så att metoden "rullar" en 6 sidig // tärning när vi kallar på den // Metoden ska sedan returnera det rullade värdet int tal = slumpObjekt.Next(1, 7); return tal; } static void Main(string[] args) { Random slump = new Random(); // Skapar en instans av klassen Random för vårt slumptal List<int> tärningar = new List<int>(); // listan för att spara våra rullade tärningar Console.WriteLine("\n\tVälkommen till tärningsgeneratorn!"); bool kör = true; while (kör) { Console.WriteLine("\n\t[1] Rulla tärning\n" + "\t[2] Kolla vad du rullade\n" + "\t[3] Avsluta"); Console.Write("\tVälj: "); int val; int.TryParse(Console.ReadLine(), out val); switch (val) { case 1: Console.Write("\n\tHur många tärningar vill du rulla?: "); bool inmatning = int.TryParse(Console.ReadLine(), out int antal); if (inmatning) { for (int i = 0; i < antal; i++) { // här kallar vi på metoden RullaTärning // och sparar det returnerade värdet i // listan tärningar tärningar.Add(RullaTärning(slump)); } tärningar.Sort(); // Jag lade till Sort-metoden som sorterar listan efter nummerordning } break; case 2: int sum = 0; // Skapar en int som ska innehålla medelvärdet av alla tärningsrullningar. if (tärningar.Count <= 0) { Console.WriteLine("\n\tDet finns inga sparade tärningsrull! "); } else { Console.WriteLine("\n\tRullade tärningar: "); foreach (int tärning in tärningar) { Console.WriteLine("\t" + tärning); } // Här ska medelvärdet skrivas ut Console.WriteLine("\tMedelvärdet av dina kast: " + Medelvärde(sum,tärningar.Count)); Console.ReadLine(); Console.WriteLine("\n\tVill du ta bort de sparade tärningarna? j/n"); Console.Write("\tSvar: "); string svar = Console.ReadLine(); if (svar == "j" || svar == "J") { tärningar.Clear(); //Använder detta för att rensa bort kasten i listan Console.WriteLine("\n\tDu har nu rensat bort dina sparade tärningar.\n"); } else break; } break; case 3: Console.WriteLine("\n\tTack för att du rullade tärning, vi ses snart igen!"); Console.ReadLine(); kör = false; break; default: Console.WriteLine("\n\tVälj 1-3 från menyn."); break; } } } public static double Medelvärde(double tal1, double tal2) { double sum = tal2 / tal1; return sum; } } }

Jag har suttit med den här övningen rätt länge nu men förstår inte hur jag ska gå tillväga. Hur lägger jag till en metod för medelvärde som faktiskt fungerar? Mitt exempel är bara ett tragiskt försök.

Uppskattar snabba svar!

Permalänk
Medlem
Skrivet av Field_trip:

using System; using System.Collections.Generic; using System.Threading; // fick lägga till dessa kataloger för att sortera vektorerna namespace ConsoleApp3 { class Program { // detta är en statisk metod med en int som ett returvärde // metoden tar en parameter i form av ett random objekt av // randomklassen static int RullaTärning(Random slumpObjekt) { // här ska du skapa kod som slumpar fram ett tal // mellan 1 och 6, så att metoden "rullar" en 6 sidig // tärning när vi kallar på den // Metoden ska sedan returnera det rullade värdet int tal = slumpObjekt.Next(1, 7); return tal; } static void Main(string[] args) { Random slump = new Random(); // Skapar en instans av klassen Random för vårt slumptal List<int> tärningar = new List<int>(); // listan för att spara våra rullade tärningar Console.WriteLine("\n\tVälkommen till tärningsgeneratorn!"); bool kör = true; while (kör) { Console.WriteLine("\n\t[1] Rulla tärning\n" + "\t[2] Kolla vad du rullade\n" + "\t[3] Avsluta"); Console.Write("\tVälj: "); int val; int.TryParse(Console.ReadLine(), out val); switch (val) { case 1: Console.Write("\n\tHur många tärningar vill du rulla?: "); bool inmatning = int.TryParse(Console.ReadLine(), out int antal); if (inmatning) { for (int i = 0; i < antal; i++) { // här kallar vi på metoden RullaTärning // och sparar det returnerade värdet i // listan tärningar tärningar.Add(RullaTärning(slump)); } tärningar.Sort(); // Jag lade till Sort-metoden som sorterar listan efter nummerordning } break; case 2: int sum = 0; // Skapar en int som ska innehålla medelvärdet av alla tärningsrullningar. if (tärningar.Count <= 0) { Console.WriteLine("\n\tDet finns inga sparade tärningsrull! "); } else { Console.WriteLine("\n\tRullade tärningar: "); foreach (int tärning in tärningar) { Console.WriteLine("\t" + tärning); } // Här ska medelvärdet skrivas ut Console.WriteLine("\tMedelvärdet av dina kast: " + Medelvärde(sum,tärningar.Count)); Console.ReadLine(); Console.WriteLine("\n\tVill du ta bort de sparade tärningarna? j/n"); Console.Write("\tSvar: "); string svar = Console.ReadLine(); if (svar == "j" || svar == "J") { tärningar.Clear(); //Använder detta för att rensa bort kasten i listan Console.WriteLine("\n\tDu har nu rensat bort dina sparade tärningar.\n"); } else break; } break; case 3: Console.WriteLine("\n\tTack för att du rullade tärning, vi ses snart igen!"); Console.ReadLine(); kör = false; break; default: Console.WriteLine("\n\tVälj 1-3 från menyn."); break; } } } public static double Medelvärde(double tal1, double tal2) { double sum = tal2 / tal1; return sum; } } }

Jag har suttit med den här övningen rätt länge nu men förstår inte hur jag ska gå tillväga. Hur lägger jag till en metod för medelvärde som faktiskt fungerar? Mitt exempel är bara ett tragiskt försök.

Uppskattar snabba svar!

Du anropar Medelvärde med sum = 0. Testa att faktiskt summera ihop tärningskasten och skicka in till metoden. Ett hett tips är också att du namnger dina metoder och variabler bättre. Det blir enklare för både dig själv och andra att faktiskt förstå vad koden gör. tal1 och tal2 är t.ex. rätt värdelösa namn och helt omöjliga att förstå vad som menas utan att leka detektiv.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W