Как создать случайный номер int в C #?

Как создать случайное целое число в C #?

вопрос задан 24.04.2010
Rella
21631 репутация

27 ответов


  • 1948 рейтинг

    Класс 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 и повторно использовать его. Если вы создадите новые экземпляры слишком близко по времени, они будут создавать ту же последовательность случайных чисел, что и случайный генератор, высеваемый из системных часов.

    ответ дан Guffa, с репутацией 541823, 24.04.2010
  • 184 рейтинг

    Каждый раз, когда вы делаете новый Random (), он инициализируется. Это означает, что в замкнутом цикле вы получаете одно и то же значение много раз. Вы должны сохранить один экземпляр 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);
        }
    }
     
    ответ дан Pankaj Mishra, с репутацией 10382, 4.10.2010
  • 165 рейтинг

    Вопрос выглядит очень просто, но ответ немного сложный. Если вы видите, что почти все предложили использовать класс Random, а некоторые предложили использовать класс криптовагонов RNG. Но тогда, когда выбирать, что.

    Для этого нам нужно сначала понять термин RANDOMNESS и философию, стоящую за ним.

    Я бы посоветовал вам посмотреть это видео, которое подробно изложено в философии RANDOMNESS, используя C # https://www.youtube.com/watch?v=tCYxc-2-3fY

    Во-первых, давайте понять философию RANDOMNESS. Когда мы говорим человеку, чтобы выбрать между RED, GREEN и YELLOW, что происходит внутри страны. Что заставляет человека выбирать КРАСНЫЙ или ЖЕЛТЫЙ или ЗЕЛЕНЫЙ?

    c # Случайный

    Некоторая первоначальная мысль идет в ум людей, который решает его выбор, это может быть любимый цвет, удачный цвет и так далее. Другими словами, некоторый начальный триггер, который мы называем RANDOM как SEED. Этот SEED является начальной точкой, триггером, который подталкивает его к выбору значения RANDOM.

    Теперь, если SEED легко догадаться, тогда такие случайные числа называются PSEUDO, и когда семя трудно угадать, эти случайные числа называются SECURED случайными числами.

    Например, человек выбирает цвет в зависимости от комбинации погоды и звука, тогда было бы трудно угадать исходное семя.

    c # Случайный

    Теперь позвольте мне сделать важное заявление:

    * «Случайный» класс генерирует только случайное число PSEUDO и генерирует безопасное случайное число, которое нам нужно использовать для класса «RNGCryptoServiceProvider».

    c # Случайный

    Случайный класс принимает значения семян из ваших тактовых импульсов процессора, которые очень предсказуемы. Таким образом, другими словами, класс RANDOM класса C # генерирует псевдослучайные числа, ниже приведен код для него.

     Random rnd= new Random();
    int rndnumber = rnd.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 генерирует безопасные случайные числа.

    ответ дан Shivprasad Koirala, с репутацией 15205, 14.06.2016
  • 74 рейтинг

    Остерегайтесь того, что new Random() выставляется на текущую временную метку.

    Если вы хотите сгенерировать только одно число, вы можете использовать:

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

    Для получения дополнительной информации просмотрите класс Random , хотя обратите внимание:

    Однако, поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания разных случайных объектов с близкой последовательностью создает генераторы случайных чисел, которые производят идентичные последовательности случайных чисел

    Поэтому не используйте этот код для генерации серии случайных чисел.

    ответ дан Fyodor Soikin, с репутацией 40560, 24.04.2010
  • 42 рейтинг
    Random r = new Random();
    int n = r.Next();
    
    ответ дан Joren, с репутацией 11813, 24.04.2010
  • 22 рейтинг

    Я хотел добавить криптографически безопасную версию:

    Класс 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);
    }
     
    ответ дан joordan831, с репутацией 541, 18.12.2015
  • 12 рейтинг

    Вы можете использовать метод StaticRandom от Jon Skeet в библиотеке классов MiscUtil, которую он построил для псевдослучайного числа.

     using System;
    using MiscUtil;
    
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(StaticRandom.Next());
            }
        }
    }
     
    ответ дан mbcrump, с репутацией 715, 24.04.2010
  • 11 рейтинг

    лучше засеять случайный объект с текущими миллисекундами, чтобы гарантировать истинное случайное число, и вы почти не найдете дубликатов, используя его много раз

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

    Обновить

    Я знаю, что new Random() использует текущие тики в качестве семени, но посев с текущими миллисекундами по-прежнему достаточно хорош, так как это хороший случайный старт

    Последняя оставшаяся точка состоит в том, что вам не нужно инициализировать new Random() каждый раз, когда вам нужно случайное число, инициировать один случайный объект, а затем использовать его столько раз, сколько вам нужно внутри цикла или чего-то еще

    ответ дан Mohamed Selim, с репутацией 1522, 1.11.2015
  • 8 рейтинг

    Я пробовал все эти решения, исключая ответ COBOL ... lol

    Ни одно из этих решений не было достаточно хорошим. Мне нужны рандомы в быстром для цикла 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);
    }
     

    Обновление : седирование не требуется, если вы создаете экземпляр класса 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); 
    }
     

    Я признаю, что мне нравится этот подход лучше.

    ответ дан Proximo, с репутацией 1676, 19.05.2015
  • 6 рейтинг

    Я использую ниже код для случайного числа:

     var random = new Random((int)DateTime.Now.Ticks);
    var randomValue = random.Next(startValue, endValue + 1);
     
    ответ дан shA.t, с репутацией 12536, 14.10.2015
  • 6 рейтинг

    Числа, созданные встроенным классом Random (System.Random), генерируют псевдослучайные числа.

    Если вам нужны истинные случайные числа, самое близкое, что мы можем получить, это «безопасный псевдослучайный генератор», который может быть сгенерирован с использованием криптографических классов в C #, таких как RNGCryptoServiceProvider .

    Тем не менее, если вам все еще нужны истинные случайные числа, вам нужно будет использовать внешний источник, такой как устройства, учитывающие радиоактивный распад, в качестве семени для генератора случайных чисел. Поскольку, по определению, любое число, порожденное чисто алгоритмическими средствами, не может быть по-настоящему случайным.

    ответ дан Anshita Arya, с репутацией 71, 22.07.2015
  • 4 рейтинг

    Это класс, который я использую. Работает как 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);
        }
    }
     
    ответ дан AskethZ, с репутацией 49, 7.12.2014
  • 4 рейтинг
    Random random = new Random ();
    int randomNumber = random.Next (lowerBound,upperBound);
    
    ответ дан ReRoute, с репутацией 151, 17.03.2017
  • 3 рейтинг

    Модифицированный ответ отсюда .

    Если у вас есть доступ к совместимому с Intel Secure Key процессору, вы можете генерировать реальные случайные числа и строки, используя эти библиотеки: https://github.com/JebteK/RdRand и https://www.rdrand.com/

    Просто скачайте последнюю версию здесь , включите Jebtek.RdRand и добавьте в нее инструкцию для использования. Затем все, что вам нужно сделать, это:

     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
     

    Если у вас нет совместимого процессора для выполнения кода, просто используйте службы RESTful на rdrand.com. С библиотекой обертки RdRandom, включенной в ваш проект, вам просто нужно это сделать (вы получаете 1000 бесплатных звонков при регистрации):

     string ret = Randomizer.GenerateKey(<length>, "<key>");
    uint ret = Randomizer.GenerateUInt("<key>");
    byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");
     
    ответ дан JebaDaHut, с репутацией 354, 27.03.2014
  • 3 рейтинг

    Пока все в порядке:

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

    Вы хотите контролировать ограничение (мин и макс.) В большинстве случаев. Поэтому вам нужно указать, где начинается и заканчивается случайное число.

    Метод Next() принимает два параметра: min и max.

    Поэтому, если я хочу, чтобы мое случайное число было между 5 и 15, я бы просто сделал

     int randomNumber = random.Next(5, 16)
     
    ответ дан ojonugwa ochalifu, с репутацией 14443, 22.08.2014
  • 2 рейтинг
     Random rand = new Random();
    int name = rand.Next()
     

    Поместите любые значения, которые вы хотите во втором круглых скобках, убедитесь, что вы указали имя, написав подсказку и двойную вкладку, чтобы сгенерировать код

    ответ дан user3773367, с репутацией 53, 25.06.2014
  • 1 рейтинг

    Числа, рассчитанные компьютером через детерминированный процесс, по определению не могут быть случайными.

    Если вам нужны подлинные случайные числа, случайность возникает из-за атмосферного шума или радиоактивного распада.

    Вы можете попробовать, например, RANDOM.ORG (это снижает производительность)

    ответ дан Stefano Lonati, с репутацией 346, 14.03.2016
  • 1 рейтинг

    Я хотел продемонстрировать, что происходит, когда новый случайный генератор используется каждый раз. Предположим, у вас есть два метода или два класса, для каждого из которых требуется случайное число. И наивно вы их кодируете:

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

    Как вы думаете, вы получите два разных идентификатора? НЕА

     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; }
    }
     
    ответ дан ja72, с репутацией 17657, 8.04.2016
  • 1 рейтинг

    Для сильного случайного семени я всегда использую 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);
            }
        }
    }
     
    ответ дан Davit Tvildiani, с репутацией 1261, 25.05.2018
  • 0 рейтинг

    Повторно использовать один экземпляр Random

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

    ответ дан Ankit Agarwal, с репутацией 55, 14.06.2018
  • 0 рейтинг

    У меня всегда есть методы, которые генерируют случайные числа, которые помогают в различных целях. Надеюсь, это тоже поможет:

     public class RandomGenerator  
    {  
        public int RandomNumber(int min, int max)  
        {  
            Random random = new Random();  
            return random.Next(min, max);  
        }  
    
        public string RandomString(int size, bool lowerCase)  
        {  
            StringBuilder builder = new StringBuilder();  
            Random 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();  
        }  
    }
     
    ответ дан PatsonLeaner, с репутацией 105, 15.05.2018
  • 0 рейтинг

    Почему бы не использовать int randomNumber = Random.Range(start_range, end_range) ?

    ответ дан Recomer, с репутацией 125, 19.03.2016
  • 0 рейтинг

    Вы можете попробовать со случайным значением семени, используя ниже:

     var rnd = new Random(11111111); //note: seed value is 11111111
    
    string randomDigits = rnd.Next().ToString().Substring(0, 8);
    
    var requestNumber = $"SD-{randomDigits}";
     
    ответ дан Rejwanul Reja, с репутацией 420, 22.04.2018
  • 0 рейтинг

    Быстро и просто для встроенного, используйте следующий код:

     new Random().Next(min, max);
    
    // for example unique name
    strName += "_" + new Random().Next(100, 999);
     
    ответ дан Zolfaghari, с репутацией 659, 10.05.2018
  • 0 рейтинг

    Попробуйте эти простые шаги для создания случайных чисел:

    создать функцию

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

    Используйте вышеуказанную функцию в том месте, где вы хотите использовать случайные числа. Предположим, вы хотите использовать его в текстовом поле.

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

    0 - мин, а 999 - макс. Вы можете изменить значения так, как хотите.

    Также проверьте ответ на этой странице .

    ( http://solutions.musanitech.com/c-how-to-create-random-numbers/ )

    ответ дан Hani Mehdi, с репутацией 94, 9.09.2015
  • -2 рейтинг

    Я предполагаю, что вам нужен равномерно распределенный генератор случайных чисел, как показано ниже. Случайное число в большинстве языков программирования, включая 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)
     

    Случайные гауссовские переменные

    ответ дан auto9817, с репутацией 13, 14.05.2018
  • -3 рейтинг
      int n = new Random().Next();
     

    вы также можете дать минимальное и максимальное значение Next() функции. подобно

      int n = new Random().Next(5,10);
     
    ответ дан Muhammad Awais, с репутацией 1659, 8.08.2016