c# - usage - vb net control
如何在C#中生成一個隨機int數? (15)
如何在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
實例並重用它。 如果你創建新實例的時間太近,它們將產生相同的一系列隨機數,因為隨機發生器從系統時鐘中播種。
你可以嘗試使用下面的隨機種子值:
var rnd = new Random(11111111); //note: seed value is 11111111
string randomDigits = rnd.Next().ToString().Substring(0, 8);
var requestNumber = $"SD-{randomDigits}";
您可以在MiscUtil類庫中使用Jon Skeet的StaticRandom方法,該類庫為偽隨機數構建。
using System;
using MiscUtil;
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(StaticRandom.Next());
}
}
}
我使用下面的代碼來獲得一個隨機數:
var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);
我想添加一個加密安全版本:
RNGCryptoServiceProvider類( 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);
}
我想演示每次使用新隨機發生器時會發生什麼。 假設你有兩個方法或兩個類,每個方法都需要一個隨機數。 你天真地編碼他們就像:
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? 不
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; }
}
根據定義,計算機通過確定性過程計算的數字不能是隨機的。
如果你想要一個真正的隨機數,隨機性來自大氣噪聲或放射性衰變。
你可以嘗試例如RANDOM.ORG(它會降低性能)
每次你做新的隨機()它被初始化。 這意味著在一個緊密的循環中,您可以獲得相同的價值。 您應該保留一個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);
}
}
為什麼不使用int randomNumber = Random.Range(start_range, end_range)
?
由內置Random
類(System.Random)生成的數字生成偽隨機數。
如果你想要真正的隨機數,我們可以得到的最接近的是“安全的偽隨機生成器”,它可以通過使用C#中的加密類(例如RNGCryptoServiceProvider
來生成。
即便如此,如果你仍然需要真正的隨機數,你將需要使用外部資源,例如將放射性衰變作為隨機數發生器種子的裝置。 由於根據定義,純算法生成的任何數字都不能真正隨機。
這個問題看起來很簡單,但答案有點複雜。 如果您幾乎看到每個人都建議使用Random類,並且有人建議使用RNG加密類。 但那麼什麼時候選擇。
為此,我們需要首先理解術語隨機及其背後的哲學。
我鼓勵你使用C# https://www.youtube.com/watch?v=tCYxc-2-3fY tCYxc-2-3fY觀看這部深入了解RANDOMNESS理念的視頻
首先讓我們理解RANDOMNESS的理念。 當我們告訴一個人在紅色,綠色和黃色之間進行選擇時,內部會發生什麼。 是什麼讓一個人選擇紅色或黃色或綠色?
一些初步的想法進入了決定他選擇的人的思想,它可以是喜歡的顏色,幸運的顏色等等。 換句話說,我們在RANDOM中稱為SEED的一些初始觸發器。這個SEED是一個起點,觸發器指示他選擇RANDOM值。
現在,如果SEED容易被猜出,那麼這些隨機數被稱為PSEUDO,並且當種子很難猜測時,那些隨機數被稱為SECURED隨機數。
例如,一個人選擇的顏色取決於天氣和聲音的組合,那麼很難猜出最初的種子。
現在讓我作一個重要的聲明:
*“隨機”類僅生成PSEUDO隨機數並生成SECURE隨機數,我們需要使用“RNGCryptoServiceProvider”類。
隨機類從您的CPU時鐘中獲取非常可預測的種子值。 換句話說,C#的RANDOM類生成偽隨機數,下面是相同的代碼。
Random rnd= new Random();
int rndnumber = rnd.Next()
RNGCryptoServiceProvider類使用OS熵來生成種子。 OS熵是一個隨機值,它是使用聲音,鼠標點擊和鍵盤計時,熱溫度等產生的。以下代碼為相同。
using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())
{
byte[] rno = new byte[5];
rg.GetBytes(rno);
int randomvalue = BitConverter.ToInt32(rno, 0);
}
要了解OS熵,請參閱此視頻https://www.youtube.com/watch?v=tCYxc-2-3fY從11:20開始說明OS熵的邏輯。 因此,用簡單的詞語RNG Crypto生成SECURE隨機數字。
這是我使用的課程。 像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);
}
}
int n = new Random().Next();
你也可以給Next()
函數提供最小值和最大值。 喜歡
int n = new Random().Next(5,10);
Random r = new Random();
int n = r.Next();
Random randomNumberGenerator = new Random ();
int randomNumber = randomNumberGenerator.Next (lowerBound,upperBound);