ฉันจะสร้างจำนวนเต็มแบบสุ่มใน C # ได้อย่างไร
ฉันจะสร้างจำนวนเต็มแบบสุ่มใน C # ได้อย่างไร
คำตอบ:
Random
ระดับใช้ในการสร้างตัวเลขสุ่ม (สุ่มหลอกว่าเป็นของหลักสูตร.)
ตัวอย่าง:
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
หากคุณกำลังจะสร้างหมายเลขสุ่มมากกว่าหนึ่งหมายเลขคุณควรเก็บRandom
อินสแตนซ์ไว้และนำมาใช้ซ้ำ หากคุณสร้างอินสแตนซ์ใหม่ในเวลาใกล้เกินไปพวกเขาจะสร้างหมายเลขสุ่มชุดเดียวกับตัวสร้างแบบสุ่มถูก seeded จากนาฬิกาของระบบ
rnd
เป็นstatic
และ / หรือตั้งค่าเพียงครั้งเดียวเมื่อเริ่มต้นรหัส
Random
...
Random
เพื่อทำให้การสุ่มของคุณมีประสิทธิภาพมากขึ้น: ericlippert.com/2019/02/04/fixing-random-part-2และcodeblog.jonskeet.uk/2009/11/04/revisiting -randomness
คำถามดูง่ายมาก แต่คำตอบนั้นซับซ้อนเล็กน้อย หากคุณเห็นเกือบทุกคนแนะนำให้ใช้คลาส Random และบางคนแนะนำให้ใช้คลาส Crypto RNG แต่เมื่อไหร่จะเลือกอะไร
เพื่อที่เราจะต้องเข้าใจคำว่า RANDOMNESS และปรัชญาที่อยู่เบื้องหลัง
ฉันอยากจะแนะนำให้คุณดูวิดีโอนี้ซึ่งลึกลงไปในปรัชญาของ RANDOMNESS โดยใช้ C # https://www.youtube.com/watch?v=tCYxc-2-3fY
สิ่งแรกให้เราเข้าใจปรัชญาของความสุ่ม เมื่อเราบอกคนให้เลือกระหว่างสีแดงสีเขียวและสีเหลืองสิ่งที่เกิดขึ้นภายใน อะไรทำให้คนเลือกแดงหรือเหลืองหรือเขียว
ความคิดเริ่มต้นบางอย่างเข้ามาในใจของคนที่ตัดสินใจเลือกของเขามันอาจเป็นสีที่ชื่นชอบสีที่โชคดีและอื่น ๆ กล่าวอีกนัยหนึ่งบางอย่างเริ่มต้นที่เราเรียกในสุ่มเป็น SEED นี่คือจุดเริ่มต้นเรียกที่กระตุ้นให้เขาเลือกค่า RANDOM
ตอนนี้ถ้าเมล็ดเป็นเรื่องง่ายที่จะคาดเดาแล้วชนิดของการสุ่มตัวเลขเหล่านี้จะเรียกว่าเป็นเทียมและเมื่อเมล็ดเป็นเรื่องยากที่จะคาดเดาตัวเลขสุ่มเหล่านี้จะเรียกว่า ที่ปลอดภัยตัวเลขสุ่ม
ตัวอย่างเช่นคนที่เลือกเป็นสีขึ้นอยู่กับสภาพอากาศและการรวมกันของเสียงแล้วมันจะเป็นการยากที่จะเดาเมล็ดเริ่มต้น
ตอนนี้ให้ฉันทำคำสั่งที่สำคัญ: -
* คลาส“ Random” สร้างเฉพาะหมายเลขสุ่ม PSEUDO และเพื่อสร้างหมายเลขสุ่มที่ปลอดภัยเราต้องใช้คลาส“ RNGCryptoServiceProvider”
คลาสสุ่มรับค่าเมล็ดจากนาฬิกา CPU ของคุณซึ่งสามารถคาดการณ์ได้อย่างมาก ดังนั้นในคำอื่น ๆ คลาส RANDOM ของ C # สร้างตัวเลขสุ่มหลอกด้านล่างเป็นรหัสสำหรับเดียวกัน
** หมายเหตุ: ** .NET Core 2.0.0+
ใช้เมล็ดพันธุ์ที่แตกต่างกันใน constructor parameterless: แทนนาฬิกา CPU Guid.NewGuid().GetHashCode()
จะใช้
var random = new Random();
int randomnumber = random.Next()
ในขณะที่RNGCryptoServiceProvider
คลาสใช้เอนโทรปีของ OS เพื่อสร้างเมล็ด เอนโทรปีของระบบปฏิบัติการเป็นค่าแบบสุ่มซึ่งสร้างขึ้นโดยใช้เสียงการคลิกเมาส์และการตั้งเวลาแป้นพิมพ์อุณหภูมิความร้อนเป็นต้นด้านล่างจะเป็นรหัสเดียวกัน
using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())
{
byte[] rno = new byte[5];
rg.GetBytes(rno);
int randomvalue = BitConverter.ToInt32(rno, 0);
}
หากต้องการทำความเข้าใจกับเอนโทรปีของระบบปฏิบัติการโปรดดูวิดีโอนี้จาก 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fYซึ่งอธิบายตรรกะของเอนโทรปีของระบบปฏิบัติการ ดังนั้นการใส่คำง่ายๆ RNG Crypto จึงสร้างตัวเลขสุ่มที่ปลอดภัย
RandomNumberGenerator.Create()
แทนการเรียกตัวสร้างRNGCryptoServiceProvider
เพราะมันไม่สามารถใช้ได้กับแพลตฟอร์มทั้งหมด
ทุกครั้งที่คุณทำ Random () ใหม่มันจะเริ่มต้นได้ ซึ่งหมายความว่าในวงแคบคุณจะได้รับค่าเท่ากันหลายครั้ง คุณควรเก็บอินสแตนซ์แบบสุ่มเดียวและใช้ Next ต่อไปบนอินสแตนซ์เดียวกัน
//Function to get random number
private static readonly Random getrandom = new Random();
public static int GetRandomNumber(int min, int max)
{
lock(getrandom) // synchronize
{
return getrandom.Next(min, max);
}
}
Random
วัตถุเดียวกัน ในทั้งสองกรณีฉันได้รับหมายเลขสุ่มเหมือนกัน ด้วยวิธีการจาก Pankaj มันไม่ได้เกิดขึ้น บางทีนี่อาจเป็นการสุ่มแต่ฉันสงสัยในตอนนี้ ฉันกำลังสอบถามหมายเลขสุ่มในวินาทีเดียวกันจากกระทู้ที่แตกต่างกัน
ระวังให้ดี new Random()
seeded บนเวลาปัจจุบัน
หากคุณต้องการสร้างเพียงหมายเลขเดียวคุณสามารถใช้:
new Random().Next( int.MinValue, int.MaxValue )
สำหรับข้อมูลเพิ่มเติมให้ดูที่คลาสRandomแต่โปรดทราบว่า:
อย่างไรก็ตามเนื่องจากนาฬิกามีความละเอียดแน่นอนใช้ตัวสร้างแบบไร้พารามิเตอร์เพื่อสร้างวัตถุสุ่มที่แตกต่างกันอย่างต่อเนื่องอย่างใกล้ชิดสร้างตัวสร้างตัวเลขสุ่มที่สร้างลำดับของตัวเลขสุ่มที่เหมือนกัน
ดังนั้นอย่าใช้รหัสนี้เพื่อสร้างชุดหมายเลขสุ่ม
new Random()
วงเป็นจุดสำคัญ
Random r = new Random();
int n = r.Next();
ฉันต้องการเพิ่มรุ่นที่ปลอดภัยด้วยการเข้ารหัส:
RNGCryptoServiceProvider Class ( MSDNหรือdotnetperls )
มันใช้ IDisposable
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
byte[] randomNumber = new byte[4];//4 for int32
rng.GetBytes(randomNumber);
int value = BitConverter.ToInt32(randomNumber, 0);
}
คุณสามารถใช้วิธีการStaticRandomของ Jon Skeet ภายในไลบรารีคลาส MiscUtil ที่เขาสร้างขึ้นสำหรับตัวเลขสุ่มหลอก
using MiscUtil;
...
for (int i = 0; i < 100;
Console.WriteLine(StaticRandom.Next());
ฉันได้ลองใช้วิธีแก้ไขปัญหาทั้งหมดนี้แล้วโดยไม่รวมคำตอบของ COBOL ... lol
วิธีแก้ปัญหาเหล่านี้ไม่ดีพอ ฉันต้องการ randoms อย่างรวดเร็วสำหรับ int loop และฉันได้รับค่าที่ซ้ำกันมากมายแม้ในช่วงที่กว้างมาก หลังจากตัดสินใจเลือกผลลัพธ์แบบสุ่มนานเกินไปฉันก็ตัดสินใจแก้ปัญหานี้ในที่สุด
มันคือทั้งหมดที่เกี่ยวกับเมล็ด
ฉันสร้างจำนวนเต็มแบบสุ่มโดยแยกวิเคราะห์ตัวเลขที่ไม่ใช่ตัวเลขจาก Guid จากนั้นฉันใช้สิ่งนั้นเพื่อยกระดับคลาส Random ของฉัน
public int GenerateRandom(int min, int max)
{
var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
return new Random(seed).Next(min, max);
}
อัปเดต : การสร้างไม่จำเป็นถ้าคุณสร้างอินสแตนซ์ของคลาสสุ่มหนึ่งครั้ง ดังนั้นจะเป็นการดีที่สุดถ้าสร้างคลาสสแตติกและเรียกใช้เมธอดนั้น
public static class IntUtil
{
private static Random random;
private static void Init()
{
if (random == null) random = new Random();
}
public static int Random(int min, int max)
{
Init();
return random.Next(min, max);
}
}
จากนั้นคุณสามารถใช้คลาสคงที่เช่นนี้ ..
for(var i = 0; i < 1000; i++)
{
int randomNumber = IntUtil.Random(1,100);
Console.WriteLine(randomNumber);
}
ฉันยอมรับว่าฉันชอบวิธีนี้ดีกว่า
ตัวเลขที่สร้างโดย inbuilt Random
คลาส (System.Random) สร้างตัวเลขสุ่มหลอก
หากคุณต้องการตัวเลขสุ่มจริงที่ใกล้เคียงที่สุดที่เราจะได้คือ "secure Pseudo Random Generator" ซึ่งสามารถสร้างขึ้นได้โดยใช้คลาส Cryptographic ใน C # เช่น RNGCryptoServiceProvider
เช่น
อย่างไรก็ตามหากคุณยังต้องการตัวเลขสุ่มจริงคุณจะต้องใช้แหล่งข้อมูลภายนอกเช่นอุปกรณ์ที่บัญชีสำหรับการสลายกัมมันตรังสีเป็นเมล็ดสำหรับเครื่องกำเนิดหมายเลขสุ่ม เนื่องจากตามคำจำกัดความหมายเลขใด ๆ ที่สร้างขึ้นโดยวิธีอัลกอริธึมล้วนไม่สามารถสุ่มได้อย่างแท้จริง
สร้างวัตถุสุ่ม
Random rand = new Random();
และใช้มัน
int randomNumber = rand.Next(min, max);
คุณไม่จำเป็นต้องเริ่มต้นnew Random()
ทุกครั้งที่คุณต้องการหมายเลขสุ่มเริ่มต้นหนึ่งสุ่มแล้วใช้มันหลายครั้งเท่าที่คุณต้องการภายในวงหรืออะไรก็ตาม
new Random()
ใช้เห็บปัจจุบันเป็นเมล็ด เมื่อคุณสร้างอินสแตนซ์หลายอินสแตนซ์ภายในมิลลิวินาทีเดียวกัน (ซึ่งตรงข้ามกับติ๊ก) คุณจะได้รับค่าเดิมที่ส่งคืน
หากคุณเข้าถึง CPU ที่เข้ากันได้กับ Intel Secure Key คุณสามารถสร้างตัวเลขและสตริงแบบสุ่มโดยใช้ไลบรารีเหล่านี้: https://github.com/JebteK/RdRandและhttps://www.rdrand.com/
เพียงดาวน์โหลดเวอร์ชันล่าสุดจากที่นี่รวม Jebtek.RdRand และเพิ่มคำสั่งที่ใช้สำหรับมัน จากนั้นสิ่งที่คุณต้องทำคือ:
// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();
// Generate 10 random characters
string key = RdRandom.GenerateKey(10);
// Generate 64 random characters, useful for API keys
string apiKey = RdRandom.GenerateAPIKey();
// Generate an array of 10 random bytes
byte[] b = RdRandom.GenerateBytes(10);
// Generate a random unsigned int
uint i = RdRandom.GenerateUnsignedInt();
หากคุณไม่มีซีพียูที่ใช้งานร่วมกันได้เพื่อรันโค้ดบนเพียงแค่ใช้บริการ RESTful ที่ rdrand.com ด้วยไลบรารี wrapper RdRandom ที่รวมอยู่ในโครงการของคุณคุณจะต้องทำสิ่งนี้ (คุณจะได้รับ 1,000 การโทรฟรีเมื่อคุณสมัคร):
string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");
ฉันใช้โค้ดด้านล่างเพื่อมีหมายเลขสุ่ม (ไม่แนะนำ):
var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);
ในขณะนี้ก็โอเค:
Random random = new Random();
int randomNumber = random.Next()
คุณต้องการควบคุมขีด จำกัด (ต่ำสุดและสูงสุด mumbers) ส่วนใหญ่ ดังนั้นคุณต้องระบุตำแหน่งที่การสุ่มเริ่มต้นและสิ้นสุด
Next()
วิธีการรับสองพารามิเตอร์นาทีและแม็กซ์
ดังนั้นถ้าฉันต้องการให้เลขสุ่มอยู่ระหว่าง 5 ถึง 15 ฉันจะทำ
int randomNumber = random.Next(5, 16)
นี่คือคลาสที่ฉันใช้ ทำงานเหมือนRandomNumber.GenerateRandom(1, 666)
internal static class RandomNumber
{
private static Random r = new Random();
private static object l = new object();
private static Random globalRandom = new Random();
[ThreadStatic]
private static Random localRandom;
public static int GenerateNewRandom(int min, int max)
{
return new Random().Next(min, max);
}
public static int GenerateLockedRandom(int min, int max)
{
int result;
lock (RandomNumber.l)
{
result = RandomNumber.r.Next(min, max);
}
return result;
}
public static int GenerateRandom(int min, int max)
{
Random random = RandomNumber.localRandom;
if (random == null)
{
int seed;
lock (RandomNumber.globalRandom)
{
seed = RandomNumber.globalRandom.Next();
}
random = (RandomNumber.localRandom = new Random(seed));
}
return random.Next(min, max);
}
}
ฉันต้องการแสดงให้เห็นว่าเกิดอะไรขึ้นเมื่อมีการใช้เครื่องกำเนิดไฟฟ้าแบบสุ่มใหม่ทุกครั้ง สมมติว่าคุณมีสองวิธีหรือสองคลาสแต่ละอันต้องใช้หมายเลขสุ่ม และไร้เดียงสาคุณรหัสพวกเขาชอบ:
public class A
{
public A()
{
var rnd=new Random();
ID=rnd.Next();
}
public int ID { get; private set; }
}
public class B
{
public B()
{
var rnd=new Random();
ID=rnd.Next();
}
public int ID { get; private set; }
}
คุณคิดว่าคุณจะได้รับ ID ที่แตกต่างกันสองรายการหรือไม่? NOPE
class Program
{
static void Main(string[] args)
{
A a=new A();
B b=new B();
int ida=a.ID, idb=b.ID;
// ida = 1452879101
// idb = 1452879101
}
}
การแก้ปัญหาคือมักจะใช้เครื่องกำเนิดไฟฟ้าแบบสุ่มเดียวคง แบบนี้:
public static class Utils
{
public static readonly Random random=new Random();
}
public class A
{
public A()
{
ID=Utils.random.Next();
}
public int ID { get; private set; }
}
public class B
{
public B()
{
ID=Utils.random.Next();
}
public int ID { get; private set; }
}
RNGCryptoServiceProvider
ก็เป็นการโทรที่ดีกว่าอยู่ดี
สำหรับเมล็ดพันธุ์แบบสุ่มที่แข็งแกร่งฉันมักจะใช้ CryptoRNG ไม่ใช่ Time
using System;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
var random = new Random(GetSeed());
Console.WriteLine(random.Next());
}
public static int GetSeed()
{
using (var rng = new RNGCryptoServiceProvider())
{
var intBytes = new byte[4];
rng.GetBytes(intBytes);
return BitConverter.ToInt32(intBytes, 0);
}
}
}
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);
เช่นเดียวกับบันทึกสำหรับการอ้างอิงในอนาคต
หากคุณใช้. NET Core อินสแตนซ์สุ่มหลายรายการจะไม่อันตรายเหมือน แต่ก่อน ฉันทราบว่าคำถามนี้มาจากปี 2010 แต่เนื่องจากคำถามนี้เก่า แต่มีความดึงดูดฉันคิดว่ามันเป็นเรื่องดีที่จะบันทึกการเปลี่ยนแปลง
คุณอาจอ้างถึงคำถามนี้ที่ฉันทำกลับมาได้สักพัก:
Microsoft เปลี่ยนเมล็ดเริ่มต้นแบบสุ่มหรือไม่
โดยพื้นฐานแล้วพวกเขาเปลี่ยนเมล็ดเริ่มต้นจากEnvironment.TickCount
เป็นGuid.NewGuid().GetHashCode()
ดังนั้นถ้าคุณสร้างสุ่ม 2 อินสแตนซ์จะไม่แสดงหมายเลขเดียวกัน
คุณสามารถดูไฟล์ได้จาก. NET Framework / .NET Core (2.0.0+) ที่นี่: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d
มันไม่ปลอดภัยเท่ากับ RNGCryptoServiceProvider แต่อย่างน้อยก็ไม่ได้ให้ผลลัพธ์ที่แปลก ๆ
Interop.GetRandomBytes((byte*)&result, sizeof(int));
รหัสอยู่ในขณะนี้
ตัวเลขที่คำนวณโดยคอมพิวเตอร์ผ่านกระบวนการที่กำหนดขึ้นมาไม่สามารถสุ่มได้
หากคุณต้องการตัวเลขสุ่มของแท้การสุ่มจะมาจากเสียงรบกวนจากบรรยากาศหรือการสลายตัวของกัมมันตภาพรังสี
คุณสามารถลองเช่น RANDOM.ORG (ลดประสิทธิภาพ)
Random rand = new Random();
int name = rand.Next()
ใส่ค่าใด ๆ ที่คุณต้องการในวงเล็บที่สองตรวจสอบให้แน่ใจว่าคุณได้ตั้งชื่อโดยการเขียน prop และแท็บสองครั้งเพื่อสร้างรหัส
หากคุณต้องการให้ CSRNG สร้างตัวเลขสุ่มระหว่างนาทีและสูงสุดนี่คือสิ่งที่คุณต้องการ มันจะเริ่มต้นRandom
เรียนด้วยเมล็ดสุ่มที่ปลอดภัย
class SecureRandom : Random
{
public static byte[] GetBytes(ulong length)
{
RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider();
byte[] bytes = new byte[length];
RNG.GetBytes(bytes);
RNG.Dispose();
return bytes;
}
public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0))
{
}
public int GetRandomInt(int min, int max)
{
int treashold = max - min;
if(treashold != Math.Abs(treashold))
{
throw new ArithmeticException("The minimum value can't exceed the maximum value!");
}
if (treashold == 0)
{
throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
}
return min + (Next() % treashold);
}
public static int GetRandomIntStatic(int min, int max)
{
int treashold = max - min;
if (treashold != Math.Abs(treashold))
{
throw new ArithmeticException("The minimum value can't exceed the maximum value!");
}
if(treashold == 0)
{
throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
}
return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold);
}
}
ขออภัย OP ต้องการint
ค่าสุ่มแต่เพื่อจุดประสงค์ในการแบ่งปันความรู้หากคุณต้องการBigInteger
ค่าสุ่มคุณสามารถใช้คำสั่งต่อไปนี้:
BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));
ฉันจะสมมติว่าคุณต้องการให้เครื่องกำเนิดตัวเลขสุ่มกระจายอย่างสม่ำเสมอเหมือนด้านล่าง หมายเลขสุ่มในภาษาการเขียนโปรแกรมส่วนใหญ่รวมถึง C # และ C ++ นั้นไม่ได้สับอย่างถูกต้องก่อนที่จะใช้ ซึ่งหมายความว่าคุณจะได้รับหมายเลขเดิมซ้ำไปซ้ำมาซึ่งไม่ได้สุ่มจริงๆ เพื่อหลีกเลี่ยงการวาดจำนวนเดียวกันซ้ำไปซ้ำมาคุณจำเป็นต้องมีเมล็ด โดยทั่วไปการติ๊กในเวลานั้นก็ใช้ได้สำหรับงานนี้ จำไว้ว่าคุณจะได้รับหมายเลขเดิมซ้ำไปซ้ำมาถ้าคุณใช้เมล็ดพันธุ์เดียวกันทุกครั้ง ดังนั้นพยายามใช้เมล็ดที่แตกต่างกันเสมอ เวลาเป็นแหล่งที่ดีสำหรับเมล็ดเพราะพวกเขาสวดมนต์เสมอ
int GetRandomNumber(int min, int max)
{
Random rand = new Random((int)DateTime.Now.Ticks);
return rand.Next(min, max);
}
หากคุณกำลังมองหาตัวสร้างตัวเลขแบบสุ่มสำหรับการแจกแจงแบบปกติคุณอาจใช้การแปลง Box-Muller ตรวจสอบคำตอบของ yoyoyoyosef ในคำถามสุ่มตัวแปรเกาส์เซียน เนื่องจากคุณต้องการจำนวนเต็มคุณต้องแปลงค่าเป็นจำนวนเต็มตอนท้าย
Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)
วิธีที่ง่ายที่สุดน่าจะเป็นเพียงแค่Random.range(1, 3)
นี้จะสร้างตัวเลขระหว่าง 1 ถึง 2
คุณสามารถลองกับค่าเมล็ดแบบสุ่มโดยใช้ด้านล่าง:
var rnd = new Random(11111111); //note: seed value is 11111111
string randomDigits = rnd.Next();
var requestNumber = $"SD-{randomDigits}";
ทำไมไม่ใช้int randomNumber = Random.Range(start_range, end_range)
?
ใช้หนึ่งตัวอย่างของการสุ่มซ้ำ ๆ
// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
// Assume there'd be more logic here really
return rng.Next(10);
}
บทความนี้จะดูว่าทำไมการสุ่มทำให้เกิดปัญหามากมายและวิธีการแก้ไข http://csharpindepth.com/Articles/Chapter12/Random.aspx
Random
ไม่ใช่คลาสที่ปลอดภัยของเธรด หากคุณสร้างอินสแตนซ์เดียวคุณควร จำกัด การเข้าถึงไว้ข้างหลังกลไกการล็อค
ลองขั้นตอนง่าย ๆ เหล่านี้เพื่อสร้างตัวเลขสุ่ม:
สร้างฟังก์ชั่น:
private int randomnumber(int min, int max)
{
Random rnum = new Random();
return rnum.Next(min, max);
}
ใช้ฟังก์ชั่นด้านบนในสถานที่ที่คุณต้องการใช้ตัวเลขสุ่ม สมมติว่าคุณต้องการใช้ในกล่องข้อความ
textBox1.Text = randomnumber(0, 999).ToString();
0 คือขั้นต่ำและ 999 คือสูงสุด คุณสามารถเปลี่ยนค่าเป็นสิ่งที่คุณต้องการ
ฉันมักจะมีวิธีการที่จะสร้างตัวเลขสุ่มซึ่งช่วยในเรื่องต่างๆ ฉันหวังว่านี่อาจช่วยคุณได้เช่นกัน:
public class RandomGenerator
{
public int RandomNumber(int min, int max)
{
var random = new Random();
return random.Next(min, max);
}
public string RandomString(int size, bool lowerCase)
{
var builder = new StringBuilder();
var random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
}
รวดเร็วและง่ายสำหรับการ inline ใช้รหัสร้อง:
new Random().Next(min, max);
// for example unique name
strName += "_" + new Random().Next(100, 999);