Permalänk
Medlem

Behöver hjälp C#

Jag försöker tillämpa några nya kunskaper i C# men det går inte min väg när jag kompilerar källkoden.

Programmet gör följande:

Man skriver in ett tal som ska vara antalet sidor på en tärning som ska slås. När man skrivit in talet och trycker på enter så ska antalet sidor skickas till en statisk variabel i en annan klass som håller reda på antalet sidor. Sedan ska två metoder anropas som tilldelar två tärningsobjekt två olika värden (slumpmässigt valda) beroende på hur många sidor tärningarna har. Sen ska programmet via konsolen mata värdet på dom två slaget.

Men problemet är att jag alltid får resultatet att dom två tärningarna får samma värde. Någon snäll själ som kan hjälpa mig med detta?

Här är källkoden:

using System; class tärningar { static public int tärning_sidor; public int tärning1_värde; public int tärning2_värde; System.Random rnd1 = new System.Random(); System.Random rnd2 = new System.Random(); public void tärning1() { tärning1_värde = rnd1.Next(1, (tärning_sidor + 1)); } public void tärning2() { tärning2_värde = rnd2.Next(1, (tärning_sidor + 1)); } } class slagApp { public static void Main() { tärningar slå_objekt1 = new tärningar(); tärningar slå_objekt2 = new tärningar(); string läs_av_indata; int värde_indata; bool onoff = true; while (onoff == true) { Console.WriteLine("Skiv in antalet sidor för tärningarna eller 0 för att avsluta programmet"); Console.Write("Skriv här: "); läs_av_indata = Console.ReadLine(); if (int.TryParse(läs_av_indata, out värde_indata)) { switch (värde_indata) { case 0: { Console.WriteLine("Tack för att du andvänder mina grymma program, tack"); Console.Read(); onoff = false; break; } case 1: { Console.WriteLine("En fråga...hur kan en tärning ha en sida och vad skulle då detta program vara bra till?"); Console.Read(); break; } default: { tärningar.tärning_sidor = värde_indata; slå_objekt1.tärning1(); slå_objekt2.tärning2(); Console.WriteLine("tärning sidor: {0}", tärningar.tärning_sidor); Console.WriteLine("Tärning 1 blev: {0}\nTärning 2 blev: {1}", slå_objekt1.tärning1_värde, slå_objekt2.tärning2_värde); break; } } } else { Console.WriteLine("Du har inte angett ett nummer!!!"); continue; } } } }

Permalänk
Medlem

Inte helt säker på att detta gäller C# men det brukar gälla för de flesta Random implementationer. Random kan ta emot ett seed, ofta brukar man använda tiden som ett seed för att alltid få ett nytt seed. Sen bör du använda samma random för samtliga slumpningar så de hämtas ur samma "serie". Om du gör 2 random med samma seed och sedan hämtar varannan slumpning från dem så kommer de alltid vara samma sinsemellan.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

gjorde om lite så att jag nu bara har en Random implementator vilket naturligtvis gjorde kodningen lite enklare med det avhjälpte inte mitt problem

class tärningar { static public int tärning_sidor; public int tärning1_värde; public int tärning2_värde; System.Random rnd = new System.Random(); public void tärning1() { tärning1_värde = rnd.Next(1, (tärning_sidor + 1)); } public void tärning2() { tärning2_värde = rnd.Next(1, (tärning_sidor + 1)); } }

Permalänk
Medlem

Då jag antar att en Random skapad utan konstruktorparametrar får ett fördefinerat seed så kommer båda tärningarnas seed vara densamma, och då båda tärningarna tar en egen instans av Random så kommer de inte slumpningarna tas från samma Random serie heller. Vilket gör att du fortfarande har samma problem.

Varför gör du två tärnings objekt om du ändå har 2 tärningsvärden i varje objekt ? Antingen så gör du 2 objekt med 1 tärningsvärde i varje, eller ett objekt med två tärningsvärden, nu "har" du ju 4(2*2) stycken tärningsvärden åt gången, är det verkligen det du vill? Känns som en liten tankevurpa där!:P

Oftast använder man endast en Random instans i sitt program, så antingen bör du skapa den innan du skapar tärningarna och skicka med den i konstruktorn alternativt göra Random static för samtliga tärningar.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Antingen så lägger du en sleep mellan dina två "slå_objekt" för att komma runt problemet som Gnejs beskriver.
Detta då den defaultar till att använda tiden till seed,
http://msdn.microsoft.com/en-us/library/system.random.aspx

Skrolla ner så beskriver dom till och med detta symptom med ett exempel,

Citat:

The following example illustrates that two Random objects that are instantiated in close succession generate an identical series of random numbers.

tärningar slå_objekt1 = new tärningar(); Thread.Sleep(42); tärningar slå_objekt2 = new tärningar();

Eller så använder du bara ett av dina slåobjekt, förstår inte varför du skapar två tärningar i varje klass för att sen skapa två slå_objekt där du ändå bara använder en tärning ur varje?

slå_objekt1.tärning1(); slå_objekt1.tärning2(); Console.WriteLine("tärning sidor: {0}", tärningar.tärning_sidor); Console.WriteLine("Tärning 1 blev: {0}\nTärning 2 blev: {1}", slå_objekt1.tärning1_värde, slå_objekt1.tärning2_värde);

Förstår öht inte alls allt strul med alla objekt hit och dit när du kan göra nått i stil med:

System.Random rnd = new System.Random(); Console.WriteLine("tärning sidor: {0}", värde_indata++); Console.WriteLine("Tärning 1 blev: {0}\nTärning 2 blev: {1}", rnd.Next(1, värde_indata), rnd.Next(1, värde_indata));