Losowa wartość Random

0

Witam, otóż mam problem z poniższą częścią kodu. Chcę, aby wpisana wartość readLine2 była równa sumie losowych wartości c i g, lecz gdy wpisuje dobrze dodaną wartość c+g, liczby te wciąż się losują i zmieniają, dlatego chcę, aby c i g wylosowały losową wartość i przestały losować. Jestem początkujący. Proszę o pomoc.
Z góry dziękuję.

		Random rnd1 = new Random();
		Random rnd2 = new Random();
		if (Console.ReadLine()== "tak") {
			int c = Convert.ToInt32(rnd1.Next(1,1000));
			int g = Convert.ToInt32(rnd2.Next(1,1000));
			Console.WriteLine("Oblicz: " + c + " + " + g);
			int readLine2 = Convert.ToInt32(Console.ReadLine());
			if (readLine2 == c+g) {
				Console.WriteLine("Gratulacje!");
			}
			else {
				Console.WriteLine("Źle!");
			}
3

Po wstawionym wycinku kodu wnioskuję, że masz na myśli raczej liczby pseudolosowe, a nie losowe.

Dlaczego tworzysz dwa generatory klasy Random? Posiadają swoje ziarno, dzięki czemu są w stanie generować za każdym razem inne liczby, zatem jeden w zupełności tutaj wystarczy. Konwersja też jest zbędna, ponieważ Random.Next zwraca int:

Random rnd = new Random();
...
int c = rnd.Next(1, 1000);
int g = rnd.Next(1, 1000);

Poczytaj także o interpolacji ciągów w wolnym czasie. Stworzysz łatwiejszy zapis:

Console.WriteLine($"Oblicz: {c} + {g}");

Wracając jednak do głównego problemu:

chcę, aby c i g wylosowały losową wartość i przestały losować

Masz na myśli, żeby składniki wyrażenia matematycznego wylosować tylko raz i umożliwić użytkownikowi wielokrotne podanie odpowiedzi?

0
Ferdynand Lipski napisał(a):

Po wstawionym wycinku kodu wnioskuję, że masz na myśli raczej liczby pseudolosowe, a nie losowe.

Dlaczego tworzysz dwa generatory klasy Random? Posiadają swoje ziarno, dzięki czemu są w stanie generować za każdym razem inne liczby, zatem jeden w zupełności tutaj wystarczy. Konwersja też jest zbędna, ponieważ Random.Next zwraca int:

Random rnd = new Random();
...
int c = rnd.Next(1, 1000);
int g = rnd.Next(1, 1000);

Poczytaj także o interpolacji ciągów w wolnym czasie. Stworzysz łatwiejszy zapis:

Console.WriteLine($"Oblicz: {c} + {g}");

Wracając jednak do głównego problemu:

chcę, aby c i g wylosowały losową wartość i przestały losować

Masz na myśli, żeby składniki wyrażenia matematycznego wylosować tylko raz i umożliwić użytkownikowi wielokrotne podanie odpowiedzi?

Podam przykład: jeśli dla "c" wylosuje się wartość np. 200, a dla "g" np. 300 to, gdy użytkownik wpisze wartość 500, konsola napisze "Gratulacje!". W moim przypadku, gdy poprawnie wpisze np. 500, wartości dla "c" i "g" zostają od nowa generowane i konsola wypisuje "Żle!"

0
VersusX napisał(a):
Ferdynand Lipski napisał(a):

Po wstawionym wycinku kodu wnioskuję, że masz na myśli raczej liczby pseudolosowe, a nie losowe.

Dlaczego tworzysz dwa generatory klasy Random? Posiadają swoje ziarno, dzięki czemu są w stanie generować za każdym razem inne liczby, zatem jeden w zupełności tutaj wystarczy. Konwersja też jest zbędna, ponieważ Random.Next zwraca int:

Random rnd = new Random();
...
int c = rnd.Next(1, 1000);
int g = rnd.Next(1, 1000);

Poczytaj także o interpolacji ciągów w wolnym czasie. Stworzysz łatwiejszy zapis:

Console.WriteLine($"Oblicz: {c} + {g}");

Wracając jednak do głównego problemu:

chcę, aby c i g wylosowały losową wartość i przestały losować

Masz na myśli, żeby składniki wyrażenia matematycznego wylosować tylko raz i umożliwić użytkownikowi wielokrotne podanie odpowiedzi?

Podam przykład: jeśli dla "c" wylosuje się wartość np. 200, a dla "g" np. 300 to, gdy użytkownik wpisze wartość 500, konsola napisze "Gratulacje!". W moim przypadku, gdy poprawnie wpisze np. 500, wartości dla "c" i "g" zostają od nowa generowane i konsola wypisuje "Żle!"

Dopóki będziesz karmił forum jakimiś szczątkami kodu, oraz opisywał nieprecyzyjnym językiem ("aby c i g wylosowały losową wartość i przestały losować" - normalnie Złota Czcionka), to nic z tego wątku nie będzie

0

Oprócz tego, że liczby c i g zawsze są takie same (z powodu, który opisał Ferdynand Lipski) mi ten kod działa dobrze:

tak
Oblicz: 676 + 676
1352
Gratulacje!
tak
Oblicz: 929 + 929
1045
Zle!

Opisz dokładniej w czym jest problem.

0

Właśnie skopiowałem ten sam kod do Visual Studio i wszystko działa jak powinno. Wcześniej kombinowałem na tej stronce: https://dotnetfiddle.net/
Dziękuję wszystkim za pomoc.

1

To ja tylko tak zaznaczę/dodam jako ciekawostkę jedną rzecz jeżeli chodzi o System.Random

na dotnetfiddle jest dostępnych kilka kompilatorów - .NET Core, Roslyn oraz .NET

Jeżeli ktoś w pętli wykona ten kod, to dostanie wynik:

for (int i=0; i<10; i++)
{
	Console.Write(new System.Random().Next(10));
}

np. 4444444444, ale na kompilatorze .NET Frameworka i Roslyn, bo w .NET Corze ok. wersji 2.1 lub 2.2 zmienił się sposób seedowania Randoma i na .NET Core np. 3.1 ten sam kod generuje już taki wynik:

3340510122, więc generowanie wielu instancji Randoma w niewielkich odstępach czasu już nie niszczy rozkładu.

Remarks

The default seed value is derived from the system clock, which has finite resolution. As a result, on the .NET Framework only, different Random objects that are created in close succession by a call to the parameterless constructor will have identical default seed values and, therefore, will produce identical sets of random numbers. This problem can be avoided by using a single Random object to generate all random numbers. You can also work around it by generating your own random seed value and passing it to the Random(Int32) constructor. For more information, see the Random(Int32) constructor. Note that this limitation does not apply to .NET Core.

0

Zapamiętajcie. Obiekt klasy Random ma być stworzony TYLKO RAZ podczas działania aplikacji. Dostęp do tego powinien być przez jakiś singleton.

1 użytkowników online, w tym zalogowanych: 0, gości: 1