c# - 重複しない - vb.net ランダム文字列




どのようにC#で乱数を生成するのですか? (18)

Jon SkeetのStaticRandomメソッドをMiscUtilクラスライブラリの中で使用して、疑似乱数を構築することができます。

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}

C#で乱数を生成するには?


hereから修正された答え。

Intel Secure Key互換CPUにアクセスできる場合は、次のライブラリを使用して実際の乱数と文字列を生成できhttps://www.rdrand.com/ : https://github.com/JebteK/RdRand https://www.rdrand.com/

hereから最新バージョンをダウンロードし、Jebtek.RdRandをインクルードし、そのためにusingステートメントを追加してください。 それで、あなたがする必要があるのはこれだけです:

bool isAvailable = RdRandom.GeneratorAvailable(); //Check to see if this is a compatible CPU
string key = RdRandom.GenerateKey(10); //Generate 10 random characters
string apiKey = RdRandom.GenerateAPIKey(); //Generate 64 random characters, useful for API keys
byte[] b = RdRandom.GenerateBytes(10); //Generate an array of 10 random bytes
uint i = RdRandom.GenerateUnsignedInt() //Generate a random unsigned int

コードを実行する互換CPUがない場合は、rdrand.comのRESTfulサービスを使用してください。 あなたのプロジェクトにはRdRandomラッパーライブラリが含まれていますので、これを行うだけで済みます(申し込み時に無料で1000通の呼び出しができます):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

new Random()が現在のタイムスタンプにシードされることに注意してください。

1つの番号を生成したい場合は、次のようにします。

new Random().Next( int.MinValue, int.MaxValue )

詳細については、 Randomクラスをご覧ください。注意してください:

しかし、クロックは有限の分解能を持つため、パラメータのないコンストラクタを使用して異なるRandomオブジェクトを連続して作成すると、乱数の同じシーケンスを生成する乱数ジェネレータが作成されます

そのため、このコードを使用して一連の乱数を生成しないでください。


これは大丈夫ですが:

Random random = new Random();
int randomNumber = random.Next()

ほとんどの場合、制限(最小および最大のmumbers)を制御する必要があります。 したがって、乱数の開始と終了の場所を指定する必要があります。

Next()メソッドは、minとmaxという2つのパラメータを受け入れます。

私の乱数が5と15の間になるようにしたいのであれば、

int randomNumber = random.Next(5, 16)

なぜint randomNumber = Random.Range(start_range, end_range)使用しないのですか? int randomNumber = Random.Range(start_range, end_range)


インラインですばやく簡単に、以下のコードを使用します。

new Random().Next(min, max);

// for example unique name
strName += "_" + new Random().Next(100, 999);

乱数を作成する簡単な手順を試してみてください:

作成機能:

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

上記の関数は、乱数を使用する場所で使用します。 テキストボックスで使用したいとします。

textBox1.Text = randomnumber(0, 999).ToString();

0は最小で999は最大です。 値を自由に変更することができます。


以下を使用してランダムシード値を試すことができます:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next().ToString().Substring(0, 8);

var requestNumber = $"SD-{randomDigits}";

新しいRandom()を実行するたびに、初期化されます。 つまり、タイトなループでは、同じ価値を何度も得ることになります。 あなたは単一のランダムインスタンスを保持し、同じインスタンス上で次を使用し続ける必要があります。

//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);
    }
}

新しい乱数ジェネレータが毎回使用されるときに何が起こるかを実証したかったのです。 2つのメソッド、またはそれぞれが乱数を必要とする2つのクラスがあるとします。 そして素朴にあなたはそれらを次のようにコードします:

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; }
}

あなたは2つの異なる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
    }
}

解決方法は、 常に 1つのスタティックランダムジェネレータを使用することです。 このような:

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オブジェクトをシードする方が良いでしょう。そして、あなたはそれを何度も使って重複を見つけることはほとんどありません

Random rand = new Random(DateTime.Now.Millisecond);

更新

私は、 new Random()が現在のティックをシードとして使用していることを知っていますが、現在のミリ秒でシードすることはまだ良いスタートです

最後の残りのポイントは、乱数が必要なときにnew Random()を初期化する必要はなく、1つのRandomオブジェクトを開始してから、必要な回数だけループ内で使用するなどです


私はCOBOLの答えを除くこれらのソリューションのすべてを試してみた...笑

これらのソリューションのどれも十分なものではありませんでした。 私はintループのための高速で無作為を必要とし、私は非常に広い範囲でも重複した値のトンを得ていました。 あまりにも長い間ランダムな結果が得られた後、私はこの問題を最終的に一度だけ解決することにしました。

それはすべての種についてです。

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);
}

Update :Randomクラスを一度インスタンス化すると、シードは必要ありません。 したがって、静的なクラスを作成し、そのメソッドを呼び出すことが最善の方法です。

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); 
}

私はこのアプローチがより好きだと認めます。


私は以下のような一様分布の乱数生成器が必要だと仮定します。 C#やC ++を含むほとんどのプログラミング言語の乱数は、使用する前に正しくシャッフルされていません。 これは、あなたが同じ番号を何度も何度も何度もやり直すことを意味します。これは本当にランダムではありません。 同じ番号を何度も何度も描かないようにするには、種が必要です。 通常、時間内のティックはこのタスクでは問題ありません。 同じ種子を毎回使用している場合は、同じ番号を何度も何度も繰り返し得られることを覚えておいてください。 だから常に種を変えてみてください。 時間はいつも変化するので、時間は種にとって良い源です。

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

正規分布の乱数ジェネレータを探している場合、Box-Muller変換を使用することができます。 ランダムガウス変数問題のyoyoyoyosefによる答えをチェックしてください。 整数が必要なので、最後にdouble値を整数にキャストしなければなりません。

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)

ランダムガウス変数


私は以下のコードを使用して乱数を得る:

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);

組み込みのRandomクラス(System.Random)によって生成された数値は、疑似乱数を生成します。

真の乱数が必要な場合は、 RNGCryptoServiceProviderなどのC#の暗号クラスを使用して生成できる "安全な疑似ランダムジェネレータ"が最も近くにあります。

たとえ本当の乱数が必要な場合でも、乱数ジェネレータの種として、放射能減衰を考慮するデバイスなどの外部ソースを使用する必要があります。 定義上、純粋にアルゴリズム的手段によって生成された任意の数は真にランダムであることができない。


質問は非常に簡単に見えますが、答えはちょっと複雑です。 ほとんどの人がRandomクラスの使用を提案しており、RNG暗号クラスの使用を提案している人もいます。 しかし、いつ何を選ぶか。

そのためには、まずRANDOMNESSという用語とその背後にある哲学を理解する必要があります。

RANDOMNESSの哲学の中でC# https://www.youtube.com/watch?v=tCYxc-2-3fY tCYxc-2-3fYを使ってこのビデオを鑑賞することをお勧めします

まず、RANDOMNESSの哲学を理解しましょう。 RED、GREEN、YELLOWのいずれかを選択するように指示するときは、内部的に何が起こるのですか。 人がREDかYELLOWかGREENを選択させるのは何ですか?

いくつかの最初の考えは、彼の選択を決定する人の心に入ります、それは好きな色、幸運な色などにすることができます。 言い換えれば、我々がSEEDとしてRANDOMと呼ぶいくつかの初期トリガーである。このSEEDは始点であり、RANDOM値を選択するように促すトリガーである。

SEEDを推測するのが簡単であれば、そのような種類の乱数はPSEUDOと呼ばれ、シードを推測することが困難な場合は、 その乱数をSECURED乱数と呼びます。

例えば、天候と音の組み合わせによって人が色を選択すると、最初の種を推測することは困難です。

重要な声明を出しましょう:

* "Random"クラスはPSEUDO乱数のみを生成し、 "RNGCryptoServiceProvider"クラスを使用するために必要なSECURE乱数を生成します。

ランダムクラスは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のエントロピーを理解するには、14 https://www.youtube.com/watch?v=tCYxc-2-3fY 30のhttps://www.youtube.com/watch?v=tCYxc-2-3fYからこのビデオをhttps://www.youtube.com/watch?v=tCYxc-2-3fYここでOSのエントロピーのロジックが説明されています。 簡単な言葉で言えば、RNG Cryptoは安全な乱数を生成します。


Random r = new Random();
int n = r.Next();

Random rand = new Random();
int name = rand.Next()

2つ目のかっこに必要な値を入れて、コードを生成するためにpropとdoubleタブを記述して名前を設定してください





random