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


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


1385


источник


Ответы:


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


1837



Каждый раз, когда вы делаете новый 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);
    }
}

177



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

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

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

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

c# Random

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

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

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

c# Random

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

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

c# Random

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

Чтобы понять энтропию ОС, посмотрите это видео https://www.youtube.com/watch?v=tCYxc-2-3fY от 11:20, где объясняется логика энтропии ОС. Таким образом, вводя простые слова, RNG Crypto генерирует безопасные случайные числа.


141



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

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

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

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

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

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


68



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

42



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

Класс 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);
}

20



it's better to seed the Random object with current milliseconds, to ensure true random number, and you almost won't find duplicates using it many times

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

14



You could use Jon Skeet's StaticRandom method inside the MiscUtil class library that he built for a pseudo-random number.

using System;
using MiscUtil;

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

12



I've tried all of these solutions excluding the COBOL answer... lol

None of these solutions were good enough. I needed randoms in a fast for int loop and I was getting tons of duplicate values even in very wide ranges. After settling for kind of random results far too long I decided to finally tackle this problem once and for all.

It's all about the seed.

I create a random integer by parsing out the non-digits from Guid, then I use that to instantiate my Random class.

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: Seeding isn't necessary if you instantiate the Random class once. So it'd be best to create a static class and call a method off that.

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

Then you can use the static class like so..

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

I admit I like this approach better.


10



I use below code to have a random number:

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

6