Rasgele bir int numarası nasıl oluştururum?


1919

Nasıl C # rastgele bir tamsayı oluştururum?

Yanıtlar:


2501

RandomSınıf rasgele sayılar oluşturmak için kullanılır. (Pseudo-random tabii ki.).

Misal:

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

Birden fazla rasgele sayı oluşturacaksanız, Randomörneği saklamalı ve yeniden kullanmalısınız. Zaman içinde çok yakın yeni örnekler oluşturursanız, rastgele üretecin sistem saatinden tohumlanmasıyla aynı rastgele sayılar dizisini üretirler.


184
Unity C # kullanıcıları için sadece bir not, Unity'nin çakıştığı bir "UnityEngine.Random ()" olduğundan "System.Random ()" belirtmelisiniz ("UnityEngine.Random ()" rastgele oluşturma yeteneğine sahip değildir sayılar). Birlik her zaman Sistemi varsayılan olarak içe aktarmadığından, bu biraz karışıklığa neden olabilir.
Joehot200

2
Yeniden kullanmak için, ilan edebilir rndolarak staticve / veya kod başlatırken sadece bir kez ayarlayın.
Junior Mayhé

4
@JuniorM: Evet, yeniden kullanmak için durağan olabilir, ancak iş parçacığı güvenli olmadığı için (özellikle iş parçacığı güvenli hale getirilmeyen herhangi bir sınıf için her zaman olduğu gibi) birden çok iş parçacığından erişmemeniz için dikkatli olmalısınız. ).
Guffa

9
Bunun kriptografik olarak güvenli olmadığı konusunda bir feragatname eklemek yararlı olacağını düşünüyorum, çünkü bu popüler bir soru, birisinin körü körüne kriptografi yapmaya çalışması durumunda Random...
Daniel García Rubio

1
Mükemmel cevap. RandomRastlantısallığınızı daha sağlam hale getirmek için bazı iyi "geliştirmeler" var: ericlippert.com/2019/02/04/fixing-random-part-2 ve codeblog.jonskeet.uk/2009/11/04/revisiting -sellik .
Jesse C. Slicer

280

Soru çok basit görünüyor ama cevap biraz karmaşık. Görüyorsanız neredeyse herkes Random sınıfını kullanmayı önerdi ve bazıları RNG kripto sınıfını kullanmayı önerdi. Ama sonra ne zaman seçilir.

Bunun için önce RANDOMNESS terimini ve arkasındaki felsefeyi anlamamız gerekir.

C # kullanarak https://www.youtube.com/watch?v=tCYxc-2-3fY RANDOMNESS felsefesinde derinlemesine ilerleyen bu videoyu izlemenizi öneririm.

İlk şey, RASTİKLİK felsefesini anlamamıza izin verir. Bir kişiye KIRMIZI, YEŞİL ve SARI arasında seçim yapmasını söylediğimizde, dahili olarak ne olur. Bir kişinin KIRMIZI veya SARI veya YEŞİL'i seçmesini sağlayan nedir?

c # Rastgele

Bazı ilk düşünceler seçimine karar veren kişilerin zihnine girer, favori renk, şanslı renk ve benzeri olabilir. Başka bir deyişle, RANDOM'da SEED olarak adlandırdığımız bazı başlangıç ​​tetikleyicileriBu TOED başlangıç ​​noktasıdır, RANDOM değerini seçmesini teşvik eden tetikleyicidir.

Şimdi bir SEED'in tahmin edilmesi kolaysa, bu tür rastgele sayılar PSEUDO olarak adlandırılır ve bir tohumun tahmin edilmesi zor olduğunda bu rastgele sayılar GÜVENLİ rastgele sayılar olarak adlandırılır .

Örneğin, bir kişi hava ve ses kombinasyonuna bağlı olarak renk seçer, o zaman ilk tohumu tahmin etmek zor olurdu.

c # Rastgele

Şimdi önemli bir açıklama yapmama izin verin: -

* “Rasgele” sınıf sadece PSEUDO rasgele sayı üretir ve GÜVENLİ rasgele sayı üretmek için “RNGCryptoServiceProvider” sınıfını kullanmamız gerekir.

c # Rastgele

Rastgele sınıf, çok değerli olan CPU saatinizden tohum değerleri alır. Başka bir deyişle, C # RANDOM sınıfı sözde rasgele sayılar üretir, aşağıda aynı kod.

** Not: ** .NET Core 2.0.0+parametresiz kurucuda farklı bir tohum kullanır : kullandığı CPU saati yerine Guid.NewGuid().GetHashCode().

var random = new Random();
int randomnumber = random.Next()

İken RNGCryptoServiceProvidersınıfın kullandığı işletim tohumlarını üretmek için entropi. OS entropi, ses, fare tıklaması ve klavye zamanlamaları, termal sıcaklık vb. Kullanılarak oluşturulan rastgele bir değerdir. Aşağıda aynı kod bulunmaktadır.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
    byte[] rno = new byte[5];    
    rg.GetBytes(rno);    
    int randomvalue = BitConverter.ToInt32(rno, 0); 
}

OS entropisini anlamak için, OS entropisinin mantığının açıklandığı 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY adresinden bu videoyu izleyin . Basit bir deyişle, RNG Crypto GÜVENLİ rasgele sayılar üretir.


9
ToInt32 sadece 4 bayt ayrıştırdığı için sadece bayt [5] değil [4]?
Bernhard

6
Bu sınıfların nerede yaşadığını bilmek her zaman yararlıdır. System.Security.Cryptography
Elton

1
Tüm platformlarda bulunmadığından RandomNumberGenerator.Create()kurucuyu çağırmak yerine kullanılması önerilir RNGCryptoServiceProvider.
dzitkowskik

Ben sadece SecureRandom IS sözde rastgele nesil olduğunu kesin istiyorum.
Nùménor

Tohumun artan rastgele olması nedeniyle, rastgele bir sayı üretmem gerektiğinde yeni RNGCryptoServiceProvider nesneleri oluşturmak uygun mudur, yoksa bir RNGCryptoServiceProvider nesnesi oluşturmak ve rastgele bir sayı oluşturmak istediğimde yeniden kullanmak daha iyidir. sınıf ile yapılması gerekir?
user2150989

231

Her yeni Random () yaptığınızda başlatılır. Bu, sıkı bir döngüde aynı değeri birçok kez elde ettiğiniz anlamına gelir. Tek bir Random örneği tutmalı ve Next'i aynı örnekte kullanmaya devam etmelisiniz.

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

3
@Guffa'nın 6 ay önce cevabında söylediği şey bu değil mi? "Zaman içinde çok yakın yeni örnekler oluşturursanız, aynı rastgele sayılar dizisini üreteceklerdir"
Chris

3
@ Chris- Aynen öyle dedin. Bunda bunun uygulanmasını sağladım. Bence bunu yapmanın iyi bir yolu. Daha iyi çalışır.
Pankaj Mishra

22
Bu, seval iş parçacıklarının kullanımı için kodu senkronize eden bir uygulamadır. Bu çok iş parçacıklı bir uygulama için iyidir, ancak tek iş parçacıklı bir uygulama için zaman kaybıdır.
Guffa

@SeanWorle: İlk olarak, Guffa'nın yaklaşımıyla denedim. Sonra aynı Randomnesneyi saklamaya çalıştım . Her iki durumda da aynı rastgele sayıyı aldım. Pankaj'ın yaklaşımı ile olmadı. Belki de bu rastgele , ama şimdi şüpheliyim. Ben farklı iş parçacıkları aynı saniyede rastgele sayı için sorgulama.
test

1
@testing: Pankaj'ın yönteminin kullanılacak doğru yöntem olduğunu kabul ediyorum. Söylediğim şu basitleştirilebilir: // Fonksiyon rastgele sayı almak için özel statik salt okunur Rastgele getrandom = new Random (); public static int GetRandomNumber (int min, int max) {lock (getrandom) {// senkronize dönüş getrandom.Next (min, maks); }}
Sean Worle

92

new Random()Mevcut zaman damgasına ekilen sakının .

Yalnızca bir sayı oluşturmak istiyorsanız şunları kullanabilirsiniz:

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

Daha fazla bilgi için Rastgele sınıfa bakın, ancak lütfen unutmayın:

Bununla birlikte, saatin sonlu çözünürlüğü olduğundan, yakın zamanda farklı Rastgele nesneler oluşturmak için parametresiz yapıcıyı kullanmak, rasgele sayıların aynı dizilerini üreten rastgele sayı üreteçleri oluşturur

Bu nedenle, rastgele bir sayı dizisi oluşturmak için bu kodu kullanmayın.


41
-1: Varsayılan tohum zamana bağlıdır; bunu bir döngüde yapın ve çok rasgele olmayan sonuçlar elde edersiniz. Bir jeneratör oluşturmalı ve her seferinde ayrı bir jeneratör değil, tüm numaralarınız için kullanmalısınız.
Bevan

21
Hey, bu haksızlık. Soru rastgele int sayısının nasıl üretileceği idi. Döngüler veya serilerden bahsedilmedi.
Fyodor Soikin

26
Tamam, adil bir nokta. İptal etti. Yine de, new Random()bir döngüde kullanmamanın önemli bir nokta olduğunu düşünüyorum .
Bevan

Gelecekte bununla karşılaşacak olanlar için, şimdi açık olmalı, ama ben sadece işaret edeceğim; cevap bu nokta ile güncellendi, bunu birden çok değer için bir döngüde kullanmamak için.
vapcguy


30

Kriptografik olarak güvenli bir sürüm eklemek istedim:

RNGCryptoServiceProvider Sınıfı ( MSDN veya dotnetperls )

IDisposable uygular.

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

15

Sahte rasgele bir sayı için oluşturduğu MiscUtil sınıf kütüphanesinde Jon Skeet'in StaticRandom yöntemini kullanabilirsiniz .

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());

31
Ben sadece kaynak kodu bir göz vardı ve bu işlev tam olarak aynı rasgele sayı motoru kullanır, bir C # "dahil", ama aynı "tohum" / "ana nesne" tüm aramalar için kullanılır emin olur. (C # terminolojisini bilmediğim için özür dilerim. Ama benim açımdan, bu fonksiyon standart fonksiyondan daha iyi rastgele sayılar yapmıyor.)
Andreas Rejbrand

5
Her şeyin 'gerçekten rastgele' olması imkansızdır, çünkü her zaman varlığının doğasında olan sınırlayıcı bir faktör veya önyargı vardır. Fen derslerinde öğretmeni dinlemediniz mi? ;-)
Phill Healey

Diyelim ki ona göre bu 'gerçekten rastgele' olduğu gibi
The Mitra Boy

Bağlantı kesildi. Bu yüzden cevabınıza bulduğunuz bilgileri ekliyorsunuz.
vapcguy

13

COBOL yanıtı hariç tüm bu çözümleri denedim ... lol

Bu çözümlerin hiçbiri yeterince iyi değildi. Int döngüsü için hızlı bir şekilde rastgele ihtiyacım vardı ve çok geniş aralıklarda bile tonlarca yinelenen değer elde ediyordum. Rastgele sonuçlara çok uzun süre karar verdikten sonra sonunda bu sorunu bir kez ve herkes için çözmeye karar verdim.

Her şey tohumla ilgili.

Guid'den basamak olmayan rakamları ayrıştırarak rastgele bir tamsayı oluşturuyorum, sonra bunu Random sınıfımı başlatmak için kullanıyorum.

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

Güncelleme : Random sınıfını bir kez başlatırsanız tohumlama gerekli değildir. Bu yüzden statik bir sınıf oluşturmak ve bunun dışında bir yöntem çağırmak en iyisidir.

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

Sonra böyle statik sınıfı kullanabilirsiniz ..

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

Bu yaklaşımı daha çok sevdiğimi itiraf ediyorum.


6
Guid rastgele değil, iyi bir tohum değildir. Bir GUID rastgele olma konusunda garanti vermez, benzersizlik konusunda garanti verir. stackoverflow.com/questions/2621563/…
Magu

2
Guid iyi bir tohumdur. Sadece Rehberdeki sayıları kullanıyorum. Yöntemi kendiniz deneyin. Döngü için uzun bir süre koyun ve sonuçlara kendiniz bakın.
Proximo

1
Hmm, ikinci düşüncede .. tohum hiç gerekli değil. Yanıt güncelleniyor
Proximo

1
Güncelleme büyük nokta. Statik bir alan yapmayı bile düşünmedim, bu şekilde daha iyi çalışır ve daha temizdir.
JCisar

1
Bu cevapla ilgili bazı sorunlar var. Her şeyden önce GUID büyük bir tohum kaynağı değildir - sadece rastgele göründüğü için olduğu anlamına gelmez. Bu olabilir , kişisel ihtiyaçlar için yeterince iyi olacak. İkincisi, Random sınıfı iş parçacığı için güvenli değildir. Her iş parçacığı için bir kez başlatmanız gerekir.
Hector

11

Dahili tarafından üretilen sayılar Random sınıf (System.Random) tarafından üretilen sayılar sahte rasgele sayılar üretir.

Eğer gerçek rastgele sayılar istiyorsanız, en yakın "güvenli sözde rastgele jeneratör" C # gibi Cryptographic sınıfları kullanılarak oluşturulabilir RNGCryptoServiceProvider .

Yine de, gerçek rasgele sayılara ihtiyacınız varsa, rasgele sayı üreteci için bir tohum olarak radyoaktif bozulmayı açıklayan cihazlar gibi harici bir kaynak kullanmanız gerekecektir. Tanım gereği, tamamen algoritmik yollarla üretilen herhangi bir sayı gerçekten rastgele olamaz.


11

Rastgele bir nesne yarat

Random rand = new Random();

ve kullan

int randomNumber = rand.Next(min, max);

Eğer başlatmak zorunda değilsiniz new Random()biri Rastgele başlatmak Eğer bir döngü ya da her türlü iç ihtiyaç olarak daha sonra birçok kez olarak kullanabilirsiniz, bir rastgele sayı gerekir her zaman


5
new Random()güncel keneleri tohum olarak kullanır. Aynı milisaniye içinde birden çok örneği başlattığınızda (işaretlemenin aksine), aynı değeri döndürürsünüz.
Hans Ke sting

10
Bu aktif olarak kötü. DateTime.Now.Millisecond (DateTime.Now.Ticks'ten farklı olarak) 0 ile 999 arasında bir sayıdır. Her rastgele sayı için bunlardan yeni bir tane oluşturuyorsanız, yalnızca 1000 olasılıkınız olacaktır.
Oren Melzer

24 kişi bu cevabı oylamada ne düşünüyordu ...?
Enigmativite

10

Buradan değiştirilmiş cevap .

Intel Secure Key uyumlu bir CPU'ya erişiminiz varsa, şu kütüphaneleri kullanarak gerçek rasgele sayılar ve dizeler oluşturabilirsiniz: https://github.com/JebteK/RdRand ve https://www.rdrand.com/

En son sürümü buradan indirin , Jebtek.RdRand'i ekleyin ve bunun için bir kullanım ifadesi ekleyin. O zaman tek yapmanız gereken şudur:

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

Kodu çalıştırmak için uyumlu bir CPU'nuz yoksa, rdrand.com adresindeki RESTful hizmetlerini kullanın. Projenize dahil olan RdRandom sarıcı kütüphanesi ile bunu yapmanız yeterlidir (kayıt olduğunuzda 1000 ücretsiz çağrı alırsınız):

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

7

Rastgele bir sayıya sahip olmak için aşağıdaki kodu kullandım (önerilmez):

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

4

Bu iyi olsa da:

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

Çoğu zaman limiti kontrol etmek istersiniz (min ve maks. Mumbers). Bu yüzden rastgele sayının nerede başlayıp biteceğini belirtmeniz gerekir.

Next()Yöntemi, iki parametre, minimum ve maksimum kabul eder.

Eğer rastgele sayımın 5 ile 15 arasında olmasını istersem,

int randomNumber = random.Next(5, 16)

4

Kullandığım sınıf bu. Gibi çalışırRandomNumber.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);
    }
}

GenerateRandom sınıfınız asla 666 sayısını döndürmez, yalnızca 665'i döndürür. Bu, Random.Next max değerinin yaygın olarak yanlış anlaşılmasıdır (özellik).
Gordon Bell

3

Her seferinde yeni bir rastgele jeneratör kullanıldığında ne olduğunu göstermek istedim. Her biri rastgele bir sayı gerektiren iki yönteminiz veya iki sınıfınız olduğunu varsayalım. Ve safça onları şöyle kodlarsınız:

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

İki farklı kimlik kazanacağınızı düşünüyor musunuz? HAYIR

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

Çözüm her zaman tek bir statik rastgele jeneratör kullanmaktır. Bunun gibi:

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

O zaman bir tohumu nasıl güvenle seçersiniz?
ja72

İlk olarak, nesneleriniz 10 ms aralıklarla oluşturulmuşsa, oluşturulan rastgele sayılar varsayılan tohumdan farklıdır. İkincisi, tohum almak için etrafınızdaki rastgele çevresel veya işlem verilerini birleştirebilirsiniz. Sonra, büyük olasılıkla kendini tekrarlamaya başlayacak uzun bir sayı dizisi veya iki akış aynı olsa bile birden fazla akış isteyip istemediğinizi gösterir. Ve güvenlik konusunda endişeleriniz varsa, RNGCryptoServiceProvideryine de daha iyi bir çağrıdır.
Millie Smith

Radyoaktif bozunmaya (çok rasgele) sayıları rasgele ayırmak için küçük bir alfa parçacık radyoaktif kaynağı ve bir dedektör (duman dedektörü nasıl çalışır) ile bir randomize çip olması harika olurdu.
ja72

3

Güçlü rastgele tohumlar için zaman değil, daima CryptoRNG kullanıyorum.

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

3
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);

1
Bu kod soruyu cevaplayabilse de, sorunun nasıl çözüleceğini açıklamak ve kodu örnek veya referans olarak sağlamak daha iyidir. Yalnızca kod yanıtları kafa karıştırıcı olabilir ve bağlamdan yoksun olabilir.
Robert Columbia

3

Gelecekte referans olması için bir not gibi.

.NET Core kullanıyorsanız, birden çok Rastgele örnek eskisi kadar tehlikeli değildir. Bu sorunun 2010'dan geldiğinin farkındayım, ancak bu soru eski ama bazı çekiciliği olduğundan, değişikliği belgelemek iyi bir şey olduğunu düşünüyorum.

Bir süre önce yaptığım bu soruya başvurabilirsiniz:

Microsoft, Rastgele varsayılan çekirdeği değiştirdi mi?

Temel olarak, varsayılan çekirdeği olarak Environment.TickCountdeğiştirdiler Guid.NewGuid().GetHashCode(), bu nedenle 2 Rastgele örnek oluşturursanız aynı sayıları görüntülemez.

.NET Framework / .NET Core'dan (2.0.0+) gelen diffs dosyasını burada görebilirsiniz: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d

RNGCryptoServiceProvider kadar güvenli değil, ama en azından size garip sonuçlar vermeyecek.


Bu artık güncel değil. Kılavuzları kullanmaya karşı ciddi bir tepki vardı. Kod şimdi Interop.GetRandomBytes((byte*)&result, sizeof(int));.
Enigmativite

2

Bir bilgisayar tarafından deterministik bir süreçle hesaplanan sayılar, tanım gereği rastgele olamaz.

Gerçek bir rasgele sayılar istiyorsanız, rasgelelik atmosferik gürültü veya radyoaktif bozunmadan kaynaklanır.

Örneğin RANDOM.ORG'u deneyebilirsiniz (performansı düşürür)


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

İstediğiniz değerleri ikinci parantez içine koyun, kodu oluşturmak için prop ve çift sekme yazarak bir ad ayarladığınızdan emin olun.


1
Pervane ve çift tırnak?
DCShannon

Neden destek ve çift sekme ? Özellik için kısa el olan klavye kısayolu olmadan kodunuzun çalışmayacağını mı söylüyorsunuz?
Sнаđошƒаӽ

2

Bir CSRNG'nin bir min ve maks arasında rasgele sayılar üretmesini istiyorsanız, bu tam size göre. RandomGüvenli rastgele tohumlarla sınıfları başlatacaktır .

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

1

Üzgünüz, OP gerçekten rastgele bir intdeğer gerektirir , ancak rastgele bir BigIntegerdeğer istiyorsanız basit bir bilgi paylaşmak için aşağıdaki ifadeyi kullanabilirsiniz:

BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));

0

Aşağıdaki gibi düzgün dağıtılmış rasgele sayı üreteci istediğinizi varsayacağım. C # ve C ++ dahil olmak üzere programlama dilinin çoğunda rastgele sayı kullanılmadan önce karıştırılmaz. Bu, aynı sayıyı tekrar tekrar alacağınız anlamına gelir, bu gerçekten rastgele değildir. Aynı sayıyı tekrar tekrar çizmekten kaçınmak için bir tohuma ihtiyacınız vardır. Tipik olarak, zaman içindeki keneler bu görev için uygundur. Her seferinde aynı tohumu kullanıyorsanız aynı numarayı tekrar tekrar alacağınızı unutmayın. Bu yüzden her zaman değişen tohumları kullanmaya çalışın. Zaman tohum için iyi bir kaynaktır çünkü her zaman kovalarlar.

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

Normal dağılım için rasgele sayı üreteci arıyorsanız, bir Box-Muller dönüşümü kullanabilirsiniz. Rastgele Gauss Değişkeni Sorusunda yoyoyoyosef'in cevabını kontrol edin. Tamsayı istediğiniz için, tamsayıya çift değer atamanız gerekir.

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)

Rastgele Gauss Değişkenleri


0

En kolay yol muhtemelen sadece Random.range(1, 3)Bu 1 ve 2 arasında bir sayı üretecektir.


-1

Aşağıdakileri kullanarak rastgele tohum değeri ile deneyebilirsiniz:

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

string randomDigits = rnd.Next();

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

Teşekkürler @ MikaelDúiBolinder bu pasajı görmek için
Rejwanul Reja

-2

Neden kullanmıyorsunuz int randomNumber = Random.Range(start_range, end_range)?


İnt randomNumber = Random.Range (başlangıç_aralığı, bitiş_aralığı + 1)
Gordon Bell

3
Random.Range () mevcut mu? MSDN belgelerinde bulamadım.
Phillip Ngan

MSDN belgelerinde Random.Range () da bulamadım
user2455111

-2

Rastgele bir örneği tekrar tekrar kullanma

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

Bu makalede, rasgeleliğin neden bu kadar çok soruna neden olduğu ve bunların nasıl ele alınacağı ele alınmaktadır. http://csharpindepth.com/Articles/Chapter12/Random.aspx


Randomgüvenli bir sınıf değildir. Tek bir örnek oluşturursanız, buna bir kilitleme mekanizmasının arkasında erişimi kısıtlamanız gerekir.
Brad M

-2

Rasgele sayılar oluşturmak için şu basit adımları deneyin:

Oluşturma işlevi:

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

Yukarıdaki işlevi rastgele sayılar kullanmak istediğiniz bir yerde kullanın. Bir metin kutusunda kullanmak istediğinizi varsayalım.

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

0 min ve 999 max. Değerleri istediğiniz gibi değiştirebilirsiniz.


Bu, sistem zamanını bir tohum olarak kullandığı için, birden çok kez yakından çağrıldığında aynı sayıyı döndürür ...
MOnsDaR

1
randomnumber (0, 999) asla 999 değerini döndürmez. Maks Değer kapsayıcı değildir. Bu, Random.Next max değerinin yaygın olarak yanlış anlaşılmasıdır (özellik).
Gordon Bell

-2

Her zaman çeşitli amaçlar için yardımcı rastgele sayılar üreten yöntemleri var. Umarım bu da size yardımcı olabilir:

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

-3

Satır içi için hızlı ve kolay, aşağıdaki kodu kullanın:

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

// for example unique name
strName += "_" + new Random().Next(100, 999);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.