Forumdelen sponsras av

C# Random satsen, behöver hjälp med detta

Trädvy Permalänk
Avstängd
Registrerad
Jul 2018

C# Random satsen, behöver hjälp med detta

Hej,

ni behöver inte anta att jag är student, studerar på egen hand.

Till saken:

Jag vill göra en random sats som skriver ut siffror mellan 1-100, och den ska fortsätta skriva tills den skriver ut en specifik nummer "5" I detta fall, då ska den avbrytas.

Hur ser algorithmen ut för detta?

Har hittills skrivit :

Random random =new Random() ;
For (int I =1; i< 100; i++)

Console.Writeline(random.Next(100));

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2009

Jag kan inte exakt syntax för C#, men här är koden för hur jag skulle göra det i Java:

Random random = new Random(); int randInt; do { randInt = random.next(100); System.out.println(randInt); } while (randInt != 5);

Jag vill påpeka att en for-loop används för att loopa ett visst antal gånger, inte tills ett villkor uppfylls. I de fallen vill du använda en do-loop eller en while-loop i stället.

NZXT H2, OCZ ModXStream-PRO 600W, MSI P67A-C45, Intel i5 2500K @ 4.4GHz, Gigabyte GTX 460, 4GB Corsair Vengeance DDR3 1600MHz CL9 (2x2GB), OCZ Agility 60GB, Seagate Barracuda 250GB, 2x Western Digital Caviar 1TB

Trädvy Permalänk
Medlem
Plats
Södermalm
Registrerad
Nov 2004

Random random = new Random(); int i = 0; while ( i != 5) { i = random.Next(1, 101); Console.WriteLine(i); } Console.ReadLine();

Välkommen till Sweclockers
EDIT: Fixad

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005
Skrivet av Zipparn:

Random random = new Random(); while ( !random.Equals(5) ) { random .Next(0 , 100); Console.WriteLine(random); }

Hej, bara ett tips

Denna kan få problem om du har en väldigt snabb dator då random är baserad på klockan i datorn.
I detta fallet där du skriver till skärmen kanske det klarar sig men om du skulle lägga upp en lista med slumptal kan du få flera av samma efter varandra.

Det är bättre att använda  System.Security.Cryptography.RandomNumberGenerator då den alltid ger verkligt slumpade nummer om det är viktigt för applikationen.
https://msdn.microsoft.com/en-us/library/system.security.cryp...

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
Skrivet av Zipparn:

Random random = new Random(); while ( !random.Equals(5) ) { Console.WriteLine(random.Next(0, 100)); } Console.ReadLine();

Du kan inte använda en Random så där. Villkoret kommer alltid uppfyllas eftersom Equals för en Random inte fungerar som du verkar tro och din slumpgenerator har ingen aning om vilket tal den genererade senast.

Skrivet av ZecretW:

Hej, bara ett tips

Denna kan få problem om du har en väldigt snabb dator då random är baserad på klockan i datorn.
I detta fallet där du skriver till skärmen kanske det klarar sig men om du skulle lägga upp en lista med slumptal kan du få flera av samma efter varandra.

Det är bättre att använda  System.Security.Cryptography.RandomNumberGenerator då den alltid ger verkligt slumpade nummer om det är viktigt för applikationen.
https://msdn.microsoft.com/en-us/library/system.security.cryp...

Nej, du har totalt missförstått problematiken. Det har ingenting med hur snabb dator man har att göra, utan problemet är att den är för förutsägbar för att vara kryptografiskt säker (vilket TS garanterat inte behöver i och med att tråden handlar om flödeshantering på nybörjarnivå).

@Maldergho har en fungerande och lättöverskådlig lösning. EDIT: Dock genereras slumptal i fel intervall. random.Next(1,101) låter mer som vad TS är ute efter.

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
8700K@stock
1070 Ti@stock

Ibland har jag fel, men då är det någon annans fel.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2009
Skrivet av ZecretW:

Hej, bara ett tips

Denna kan få problem om du har en väldigt snabb dator då random är baserad på klockan i datorn.
I detta fallet där du skriver till skärmen kanske det klarar sig men om du skulle lägga upp en lista med slumptal kan du få flera av samma efter varandra.

Det är bättre att använda  System.Security.Cryptography.RandomNumberGenerator då den alltid ger verkligt slumpade nummer om det är viktigt för applikationen.
https://msdn.microsoft.com/en-us/library/system.security.cryp...

Det kommer inte ge problem om datorn är snabb eftersom klockan bara används för att sätta Random-objektets seed. Efter det första genererade talet använder den intern logik för att få ut nya random-tal. Dessutom skulle jag vilja påstå att det är overkill att börja ta upp kryptografiskt säkra random-tal på den programmeringsnivå som OT verkar vara på. Den vanliga Random-klassen funkar utmärkt för allt som inte är för professionellt bruk.

@LemonIllusion Helt rätt, mitt exempel kommer generera tal i intervallet [0,99]. Om OT vill ha intervallet [1,100] i stället så ska anropet vara

randInt = random.Next(1,101);

eller en likvärdig variant som i min erfarenhet syns användas oftare, troligen av lite äldre programmerare:

randInt = random.Next(100) + 1;

NZXT H2, OCZ ModXStream-PRO 600W, MSI P67A-C45, Intel i5 2500K @ 4.4GHz, Gigabyte GTX 460, 4GB Corsair Vengeance DDR3 1600MHz CL9 (2x2GB), OCZ Agility 60GB, Seagate Barracuda 250GB, 2x Western Digital Caviar 1TB

Trädvy Permalänk
Medlem
Plats
Södermalm
Registrerad
Nov 2004
Skrivet av Maldergho:

Ja, det är psedu-random.
Jag använde först 0 som index i mitt exempel. Det ger 100 möjliga utfall. 0-99.

(0, 100)

Vill man som TS skrivit ha 1-100 får man skriva

(1, 101)

Trädvy Permalänk
Medlem
Registrerad
Aug 2013
Skrivet av ZecretW:

Hej, bara ett tips

Denna kan få problem om du har en väldigt snabb dator då random är baserad på klockan i datorn.
I detta fallet där du skriver till skärmen kanske det klarar sig men om du skulle lägga upp en lista med slumptal kan du få flera av samma efter varandra.

Detta stämmer inte. För varje anrop till Next() så seedas instansen om. Om du däremot skapar en ny instans varje gång du itererar loopen, så finns risken för det du beskriver eftersom första seedet alltid baseras på klockan.

Men nu var det inte så TS kod var skriven.

@Maldergho hade redan nämnt detta, duh!

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005
Skrivet av LemonIllusion:

(vilket TS garanterat inte behöver i och med att tråden handlar om flödeshantering på nybörjarnivå).

Skrivet av Maldergho:

Dessutom skulle jag vilja påstå att det är overkill att börja ta upp kryptografiskt säkra random-tal på den programmeringsnivå som OT verkar vara på. Den vanliga Random-klassen funkar utmärkt för allt som inte är för professionellt bruk.

Skrivet av Stefan Lundmark:

Detta stämmer inte. För varje anrop till Next() så seedas instansen om. Om du däremot skapar en ny instans varje gång du itererar loopen, så finns risken för det du beskriver eftersom första seedet alltid baseras på klockan.

Men nu var det inte så TS kod var skriven.

Tack för all er vänliga feedback om att .NET numera tydligen har löst problemet med klockbaserad slumptalsgenerering.

Nu var mitt inlägg inte riktat till TS, jag beklagar om det inte framgick. Jag trodde det var ganska tydligt att mitt svar riktades till den som skrev just det inlägget jag valde att citera.
Jag antog att personen jag ämnade mitt inlägg till, med tanke på medlemsåret, använde C# i sitt yrkesliv och jag ville därmed bara dela med mig av de problem jag själv tidigare upplevt under mina 25+ år som utvecklare.

Jag ber ödmjukast om ursäkt och lovar att försöka undvika dessa misstag i framtiden.

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Plats
Södermalm
Registrerad
Nov 2004
Skrivet av ZecretW:

Jag ber ödmjukast om ursäkt och lovar att försöka undvika dessa misstag i framtiden.

Var inte så bugande, kompis Ingen skada skedd