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

Permalänk
Medlem

[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?

Permalänk
Hedersmedlem

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.

Visa signatur

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

Permalänk

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

Permalänk
Medlem

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

Permalänk
Medlem

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?

Permalänk
Medlem
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.

Visa signatur

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

Permalänk
Medlem
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);

Permalänk
Medlem

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