C# Kod fungerar i debug men inte när jag kör Console Application.

Permalänk

C# Kod fungerar i debug men inte när jag kör Console Application.

Hej,

Kan någon hjälpa mig att förstå varför den här koden fungerar i debug men inte när jag kör den. Då blir alla tal i vektorn samma.

public static int Random() { Random randomerare = new Random(); int randomNum = randomerare.Next(1, 26); return randomNum; } static void Main(string[] args) { int[] RNumbers = new int[7]; for (int x = 0; x < RNumbers.Length; x++) { RNumbers[x] = Random(); }

Permalänk
Medlem

Det är för att du skapar en ny Random() varje gång. Då det går så snabbt så kommer den få samma seed varje gång. Du bör aldrig skapa fler än ett Random-objekt.

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
Medlem

@medusa3604: Hej, slumpvalsgeneratorn ska bara instansieras en gång. Du skapar en ny varje gång du vill ha ett nytt nummer.
Har gjort ändringar (fet stil) som bör få det att fungera.

public static int Random(Random randomerare) { int randomNum = randomerare.Next(1, 26); return randomNum; } static void Main(string[] args) { Random randomerare = new Random(); int[] RNumbers = new int[7]; for (int x = 0; x < RNumbers.Length; x++) { RNumbers[x] = Random(randomerare); } }

Visa signatur

5900x ][ MSI B550 Tomahawk ][ 32 GB@3200C14 ][ Asus 3060ti ][ Samsung 980Pro 1TB + 2x Crucial MX300 1TB ][ Corsair HX1000i ][ Corsair 400Q ][ Asus MG278Q ][ Noctua NH-U12A

Permalänk
Medlem

När du skapar en Random med new Random() initieras den med ett seed-värde som baseras på datorns interna klocka. Eftersom du skapar en ny Random varje gång du anropar Random() och koden kör i en loop hinner klockan aldrig "ticka" och värdet från .Next() blir alltid samma.

Du vill ha en instans av Random som du hämtar värden ifrån. Något i stil med

private static IEnumerable<int> RandomInts( int startingAt, int until ) { var r = new Random(); while ( true ) { yield return r.Next( startingAt, until ); } } public static void Main(string[] args) { var rNumbers = RandomInts( 1, 26 ).Take( 7 ).ToArray(); }

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Då det verkar som nybörjare så skulle jag inte dra in 'yield' då det kan vara svårt att få kläm på i början

static Random random = new Random(); private static int Random() { return random.Next(0, 10); } public static void Main(string[] args) { // Edit: Glömde for() loopen for(int i = 0; i < 10; i++) { Console.WriteLine(Random()); } }

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Skrivet av Freezer:

@medusa3604: Hej, slumpvalsgeneratorn ska bara instansieras en gång. Du skapar en ny varje gång du vill ha ett nytt nummer.
Har gjort ändringar (fet stil) som bör få det att fungera.

public static int Random(Random randomerare) { int randomNum = randomerare.Next(1, 26); return randomNum; } static void Main(string[] args) { Random randomerare = new Random(); int[] RNumbers = new int[7]; for (int x = 0; x < RNumbers.Length; x++) { RNumbers[x] = Random(randomerare); } }

Hej och tack,

Har provat detta och det funkar fint.

Man skapar alltså metoden först och sedan skapar jag ett nytt objekt av den i Main.

Sedan anropar jag det befintliga objektet som returnerar ett random tal.

Har jag förstått det rätt?

Permalänk
Medlem

Varför inte:

static void Main(string[] args) { Random randomerare = new Random(); int[] RNumbers = new int[7]; for (int x = 0; x < RNumbers.Length; x++) { RNumbers[x] = randomerare.Next(1, 26); } }

?

@medusa3604: nej du skapar inte ett objekt av en funktion.

Visa signatur

Bättre än din.
Tagga mig för svar i trådar.

Permalänk
Medlem
Skrivet av medusa3604:

Man skapar alltså metoden först och sedan skapar jag ett nytt objekt av den i Main.

Sedan anropar jag det befintliga objektet som returnerar ett random tal.

Har jag förstått det rätt?

Inte riktigt, du har valt lite olyckliga namn i din kod. Random är en klass i C# standardbibliotek, vilket är vad du skapar ett objekt av i Main. Sen har du definierat en metod som även den heter Random, som i den nämna koden anropas med Random-objektet som argument. Testa att döpa om din metod till t.ex. GetRandom så kanske det blir lite klarare vad som är vad i koden.

Men hela poängen är alltså att endast skapa ett Random-objekt som man använder när man behöver ett slumptal. Det är inte riktiga slumptal som generas, utan så kallade pseudoslumptal som ser slumpmässiga ut men som genereras via en algoritm. Denna algoritm start med ett värde, en s.k. seed, och räknar sedan fram ett slumptal och en ny seed som används för nästa slumptal, o.s.v.

Startar man algoritmen med samma seed så får man alltså samma serie av slumptal. Och normalt används datorns tid som seed, men denna uppdateras bara t.ex. varje millisekund vilket räcker för att hinna skapa en väldans massa Random-objekt.

Permalänk
Skrivet av perost:

Inte riktigt, du har valt lite olyckliga namn i din kod. Random är en klass i C# standardbibliotek, vilket är vad du skapar ett objekt av i Main. Sen har du definierat en metod som även den heter Random, som i den nämna koden anropas med Random-objektet som argument. Testa att döpa om din metod till t.ex. GetRandom så kanske det blir lite klarare vad som är vad i koden.

Men hela poängen är alltså att endast skapa ett Random-objekt som man använder när man behöver ett slumptal. Det är inte riktiga slumptal som generas, utan så kallade pseudoslumptal som ser slumpmässiga ut men som genereras via en algoritm. Denna algoritm start med ett värde, en s.k. seed, och räknar sedan fram ett slumptal och en ny seed som används för nästa slumptal, o.s.v.

Startar man algoritmen med samma seed så får man alltså samma serie av slumptal. Och normalt används datorns tid som seed, men denna uppdateras bara t.ex. varje millisekund vilket räcker för att hinna skapa en väldans massa Random-objekt.

Tack så mycket för ditt svar.

Nu förstår jag bättre hur det hänger ihop.

Ska leka lite med detta så får jag nog kläm på det.