[c#]En Random instans för flera klasser - OOP

Trädvy Permalänk
Medlem
Plats
Skellefteå
Registrerad
Sep 2014

[c#]En Random instans för flera klasser - OOP

Går 3an gymnasiet och vi har just börjat med OOP. Jag har ett program där jag skapar ett antal instanser av en klass. Inparametrarna till denna klass slumpas fram med ett Randomobjekt, sedan i klassens konstruktor slumpas x och y värdet för instansen fram. Eftersom jag använder 2 instanser av Random objektet får jag exakt samma x/y värden om inparametrarna blir samma. Kan jag på nått sätt skapa ett Random objekt som jag kan använda till båda klasserna?

O2 Amp | HD558 | M50X | Sony MDR-100ABN | Tennmak Pro
GTX 970 | i7 7700k | 16GB RAM
OnePlus 5T

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Du kan tex titta på en public static property för att lösa problemet som du frågar om. Ett annat alternativ är att initiera sitt Random-objekt med ett seed.

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Trelleborg
Registrerad
Maj 2011

Random funktionen använder sig av någon formel, och är därför inte helt random.
Problemet är dock att den viktigaste variabeln är tiden i millisekunder, eller rättare sagt hur många millisekunder det har gått sedan 1 Januari 1970 kl 00.00.
Om du kör någon av next-funktionerna i Random-klassen direkt efter varandra så har det inte hunnit passera några millisekunder och dom kommer då ge samma värde.

Lösningen är att göra en egen liten funktion som ändrar värdet lite utifrån antal Ticks som passerat istället. (DateTime.Ticks som har en upplösning på 100 nanosekunder)
Lagra Ticks i en variabel innan du kör next-funktionen och sen hämtar du det igen efter

long diff = tickBefore - DateTimeTicks;

Sen kan du göra något kul med värdet du fått från Random-klassen med det.
t.ex: (y * diff) / 100

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

static void Main(string[] args) { Random rnd1 = new Random((int)DateTime.Now.Ticks); Random rnd2 = new Random(); for (int x = 0; x < 11; x++) { Console.WriteLine("Rnd: {0} {1}", rnd1.Next(1000), rnd2.Next(1000) ); } }

Detta är skrivit med .NET c# - funkar fint

Med vänlig hälsning Lazze

Trädvy Permalänk
Medlem
Plats
Skellefteå
Registrerad
Sep 2014

Tackar så mycket! Många fina svar, slutade med att jag använde Public Static Random rand = new Random(); eftersom det kändes enklast

Fungerar fint, finns det några drawbacks med att skriva på detta sätt, tex finns det situationer när de andra metoderna här är bättre alternativ. Eller är de bara då man verkligen vill ha två instaner av random av nån anledning?

O2 Amp | HD558 | M50X | Sony MDR-100ABN | Tennmak Pro
GTX 970 | i7 7700k | 16GB RAM
OnePlus 5T

Trädvy Permalänk
Medlem
Plats
Skövde
Registrerad
Maj 2010
Skrivet av Simon^L:

Tackar så mycket! Många fina svar, slutade med att jag använde Public Static Random rand = new Random(); eftersom det kändes enklast

Fungerar fint, finns det några drawbacks med att skriva på detta sätt, tex finns det situationer när de andra metoderna här är bättre alternativ. Eller är de bara då man verkligen vill ha två instaner av random av nån anledning?

Man brukar undvika Publika variabler då det lätt kan bli konflikter och fel
Men inte annars.

i7-6700K | MSI Z170A | MSI 1080 8GB | 16GB Kingston HyperX | Intel 600P 256GB | Samsung EVO Basic 840 250GB x2 raid 0 | Corsair RM 750W | 3 x Dell U2414H

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Simon^L:

Fungerar fint, finns det några drawbacks med att skriva på detta sätt, tex finns det situationer när de andra metoderna här är bättre alternativ. Eller är de bara då man verkligen vill ha två instaner av random av nån anledning?

Finns det egentligen någon anledning till att du faktiskt behöver flera instanser av Random? Ett alternativ är att det är upp till den som skapar instanserna att skapa slumptalen, och instanserna tar bara emot värdena (obs, jag kan inte C# ):

Random random = new Random(); SomeClass object1 = new SomeClass(random.Next(), random.Next()); SomeClass object2 = new SomeClass(random.Next(), random.Next());

Ett annat alternativ är att bara skicka in random-objektet och låta instanserna göra vad de vill med det i konstruktorn:

class SomeClass { public SomeClass(Random random) { x = random.Next(); y = random.Next(); ... } } // I Main, eller vart du nu skapar instanserna: Random random = new Random(); SomeClass object1 = new SomeClass(random); SomeClass object2 = new SomeClass(random);

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

Enkelt sagt så kan du använda static i program som du vet bara körs av 1 användare, t.ex. ett console-program eller ett installerat windowsprogram. En webb-app eller en webb-tjänst, där skall du undvika static.

// LZ