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類( MSDNdotnetperls

它實現了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);




random