Как мне сгенерировать случайное число int?


1922

Как мне генерировать случайное целое число в C #?

Ответы:


2503

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


184
Просто примечание для пользователей Unity C #, вы должны указать «System.Random ()», поскольку Unity имеет «UnityEngine.Random ()», что конфликтует (обратите внимание, что «UnityEngine.Random ()» не имеет возможности генерировать случайные номера). Так как Unity не всегда импортирует System по умолчанию, это может вызвать путаницу.
Joehot200

2
Чтобы повторно использовать его, вы можете объявить rndкак staticи / или установить его только один раз при инициализации кода.
Младший Mayhé

4
@JuniorM: Да, вы можете сделать статичным, чтобы повторно использовать его, но вы должны быть осторожны, чтобы не получить к нему доступ из нескольких потоков, поскольку он не является потокобезопасным (как обычно для любого класса, который специально не сделал потокобезопасным). ).
Гуффа

9
Я думаю, что было бы полезно добавить отказ от ответственности, что это не криптографически безопасно, так как это популярный вопрос, на тот случай, если кто-то слепо попытается сделать криптографию с Random...
Даниэль Гарсия Рубио

1
Отличный ответ. Есть несколько хороших «улучшений» Random, которые сделают вашу случайность более надежной: ericlippert.com/2019/02/04/fixing-random-part-2 и codeblog.jonskeet.uk/2009/11/04/revisiting -randomness .
Джесси С. Slicer

280

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

Для этого нам нужно сначала понять термин СЛУЧАЙНОСТЬ и его философию.

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

Прежде всего, давайте поймем философию СЛУЧАЙНОСТИ. Когда мы говорим человеку выбирать между КРАСНЫМ, ЗЕЛЕНЫМ и ЖЕЛТЫМ, что происходит внутри. Что заставляет человека выбирать красный, желтый или зеленый?

c # Случайный

Некоторая начальная мысль приходит в ум человека, который решает его выбор, это может быть любимый цвет, счастливый цвет и так далее. Другими словами, некоторый начальный триггер, который мы называем в СЛУЧАЙНОМ как SEED. Этот SEED является начальной точкой, триггером, побуждающим его выбрать СЛУЧАЙНОЕ значение.

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

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

c # Случайный

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

* «Случайный» класс генерирует только случайное число PSEUDO, и для генерации БЕЗОПАСНОГО случайного числа нам нужно использовать класс «RNGCryptoServiceProvider».

c # Случайный

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

** Примечание: ** .NET Core 2.0.0+использует другое начальное число в конструкторе без параметров: вместо тактовых частот процессора он использует Guid.NewGuid().GetHashCode().

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

В то время как RNGCryptoServiceProviderкласс использует энтропию ОС для генерации семян. Энтропия ОС - это случайное значение, которое генерируется с использованием звука, щелчков мыши и таймингов клавиатуры, температуры и т. Д. Ниже приведен код для того же.

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 генерирует БЕЗОПАСНЫЕ случайные числа.


9
не должен быть ваш байт [5] только [4], поскольку ToInt32 анализирует только 4 байта?
Бернхард

6
Всегда полезно знать, где живут эти классы. System.Security.Cryptography
Элтон

1
Рекомендуется использовать RandomNumberGenerator.Create()вместо вызова конструктора, RNGCryptoServiceProviderпоскольку он доступен не на всех платформах.
dzitkowskik

Я просто хочу уточнить, что SecureRandom - это псевдослучайная генерация.
Неменор

Из-за увеличенной случайности начального числа, можно ли создавать новые объекты RNGCryptoServiceProvider каждый раз, когда мне нужно сгенерировать случайное число, или все же лучше создать один объект RNGCryptoServiceProvider и повторно использовать его всякий раз, когда мне нужно сгенерировать случайное число, как должно быть сделано с классом Random?
user2150989

231

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

3
Разве это не то, что @Guffa сказал в своем ответе 6 месяцев назад? «Если вы создаете новые экземпляры слишком близко по времени, они будут производить ту же серию случайных чисел»
Крис

3
@ Крис: Ты правильно сказал. В этом я обеспечил реализацию этого. Я думаю, что это хороший способ сделать это. Это работает лучше.
Панкадж Мишра

22
Это реализация, которая синхронизирует код для использования из нескольких потоков. Это хорошо для многопоточного приложения, но трата времени для однопоточного приложения.
Guffa

@ SeanWorle: Сначала я попробовал это с подходом от Guffa. Затем я попытался сохранить тот же Randomобъект. В обоих случаях я получил одно и то же случайное число. С подходом из Панкаджа этого не произошло. Возможно, это случайно , но я сомневаюсь в этом сейчас. Я запрашиваю случайное число в одну секунду из разных потоков.
тестирование

1
@testing: Я согласен, что метод Панкаджа является правильным для использования. Я хочу сказать, что это можно упростить до этого: // Функция для получения случайного числа приватного статического readonly Random getrandom = new Random (); public static int GetRandomNumber (int min, int max) {lock (getrandom) {// синхронизировать return getrandom.Next (min, max); }}
Шон

92

Остерегайтесь этого new Random() посеяно на текущей метке времени.

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

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

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

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

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


41
-1: начальное число по умолчанию основано на времени; сделайте это в цикле, и вы получите очень неслучайные результаты. Вы должны создать один генератор и использовать его для всех своих чисел, а не отдельный генератор каждый раз.
Беван

21
Эй, это несправедливо. Вопрос заключался в том, как генерировать случайные целые числа. Никакие петли или серии не были упомянуты.
Федор Сойкин

26
Хорошо, честно. Аннулирована. Тем не менее, я все еще думаю, что не использовать new Random()в цикле является важным моментом.
Беван

Для тех, кто сталкивается с этим в будущем, это должно быть очевидно сейчас, но я просто укажу на это; ответ был обновлен с этой точкой, чтобы не использовать это в цикле для нескольких значений.
vapcguy


30

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

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

15

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

using MiscUtil;
...

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

31
Я только что взглянул на исходный код, и эта функция использует точно такой же механизм случайных чисел, тот, который «включен» в C #, но гарантирует, что один и тот же «начальный» / «материнский объект» используется для всех вызовов. (Мне жаль, что я не знаю терминологию C #. Но я
хочу сказать,

5
Ничто не может быть «действительно случайным», так как всегда есть какой-то ограничивающий фактор или предубеждение, которое присуще его самому существованию. Разве вы не слушали учителя на уроках естествознания? ;-)
Фил Хили

Скажем, по его словам, это настолько «по-настоящему случайное», насколько это возможно
The Mitra Boy

Неработающая ссылка сейчас. Вот почему вы включаете информацию, которую вы найдете в своем ответе.
vapcguy

13

Я перепробовал все эти решения, кроме ответа на 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); 
}

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


6
Гид не случайный, это не хорошее семя. GUID не дает гарантий относительно случайности, он дает гарантии вокруг уникальности. stackoverflow.com/questions/2621563/…
Magu

2
Гид - хорошее семя. Я использую только цифры в Guid. Попробуйте метод для себя. Поместите это в длинный цикл и посмотрите на результаты для себя.
Проксимо

1
Хм, если подумать .. семя вообще не нужно. Обновление ответа
Proximo

1
Отличный момент по поводу обновления. Я даже не думал сделать это статическим полем, этот способ работает намного лучше и чище.
JCisar

1
Есть некоторые проблемы с этим ответом. Во-первых, GUID не является хорошим исходным кодом - просто потому, что он выглядит случайным, это еще не значит, что это так. Это может быть достаточно для ваших личных потребностей. Во-вторых, класс Random не является поточно-ориентированным. Вы должны создать его экземпляр один раз за поток.
Гектор

11

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

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

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


11

создать случайный объект

Random rand = new Random();

и использовать это

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

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


5
new Random()использует текущие тики в качестве семян. Когда вы создаете несколько экземпляров в течение одной миллисекунды (в отличие от тика), вы получите одно и то же возвращаемое значение.
Ганс

10
Это активно плохо. DateTime.Now.Millisecond (в отличие от DateTime.Now.Ticks) - это число от 0 до 999. Если вы создаете новый из них для каждого случайного числа, у вас будет только 1000 возможностей.
Орен Мельцер

О чем думали 24 человека, проголосовавших за этот ответ ...?
Загадка

10

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

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

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

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

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

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

7

Я использовал код ниже, чтобы иметь случайное число (не рекомендуется):

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

4

Пока это нормально

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

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

Next()Метод принимает два параметра, мин и макс.

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

int randomNumber = random.Next(5, 16)

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

Ваш класс GenerateRandom никогда не вернет число 666, только 665. Это распространенное заблуждение (особенность) максимального значения Random.Next.
Гордон Белл

3

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

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

Ну, во-первых, если ваши объекты создаются даже с интервалом в 10 мс, сгенерированные случайные числа отличаются от начального значения по умолчанию. Во-вторых, вы можете собрать все случайные данные об окружающей среде или процессах, которые у вас есть, чтобы получить начальное значение. Тогда есть компромисс между тем, хотите ли вы одну длинную последовательность чисел, которая, скорее всего, начнет повторяться, или несколько потоков, даже если два потока окажутся идентичными. И если вы беспокоитесь о безопасности, RNGCryptoServiceProviderлучше позвонить в любом случае.
Милли Смит

Было бы здорово иметь чип рандомизатора с небольшим радиоактивным источником альфа-частиц и детектором (как работает детектор дыма), чтобы рандомизировать числа, основанные на радиоактивном распаде (который является очень случайным).
ja72

3

Для сильных случайных семян я всегда использую 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);
        }
    }
}

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

1
Хотя этот код может ответить на вопрос, лучше объяснить, как решить проблему, и предоставить код в качестве примера или ссылки. Ответы только на код могут быть запутанными и не хватает контекста.
Роберт Колумбия

3

Так же, как примечание для дальнейшего использования.

Если вы используете .NET Core, несколько экземпляров Random не так опасны, как раньше. Я знаю, что этот вопрос относится к 2010 году, но, поскольку этот вопрос старый, но имеет некоторую привлекательность, я думаю, что это хорошая вещь, чтобы задокументировать изменение.

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

Microsoft изменила случайное начальное число по умолчанию?

По сути, они изменили начальное значение по умолчанию с Environment.TickCountна Guid.NewGuid().GetHashCode(), поэтому, если вы создадите 2 экземпляра Random, он не будет отображать одинаковые числа.

Вы можете увидеть различия в файлах из .NET Framework / .NET Core (2.0.0+) здесь: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d

Он не так безопасен, как RNGCryptoServiceProvider, но по крайней мере он не даст вам странных результатов.


Это сейчас устарело. Была существенная обратная реакция против использования Guids. Код сейчас Interop.GetRandomBytes((byte*)&result, sizeof(int));.
Загадка

2

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

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

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


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

Поместите любые значения во вторые скобки, чтобы убедиться, что вы установили имя, написав prop и double tab для генерации кода.


1
Опора и двойная вкладка?
Д.С.Шеннон,

Почему опора и двойной таб ? Вы говорите, что без этого сочетания клавиш, которое является сокращением для свойства, ваш код не будет работать?
Snađошƒаӽ

2

Если вы хотите, чтобы CSRNG генерировал случайные числа от мин до макс, это для вас. Это инициализирует Randomклассы с безопасными случайными семенами.

    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

Извините, OP действительно требует случайного intзначения, но для простой цели обмена знаниями, если вы хотите случайное BigIntegerзначение, вы можете использовать следующее утверждение:

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

0

Я предполагаю, что вы хотите равномерно распределенный генератор случайных чисел, как показано ниже. Случайные числа в большинстве языков программирования, включая C # и C ++, неправильно перетасовываются перед их использованием. Это означает, что вы будете получать одно и то же число снова и снова, что на самом деле не случайно. Чтобы не рисовать одно и то же число снова и снова, вам нужно семя. Как правило, тики во времени хорошо для этой задачи. Помните, что вы будете получать одно и то же число снова и снова, если будете использовать одно и то же семя каждый раз. Поэтому старайтесь всегда использовать разные семена. Время является хорошим источником для семян, потому что они всегда растеряны.

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

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

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


0

Возможно, самый простой способ - Random.range(1, 3)это сгенерировать число от 1 до 2.


-1

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

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

string randomDigits = rnd.Next();

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

Спасибо @ MikaelDúiBolinder, чтобы увидеть этот фрагмент
Rejwanul Reja

-2

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


На самом деле int randomNumber = Random.Range (start_range, end_range + 1)
Гордон Белл

3
Существует ли Random.Range ()? Я не мог найти это в документации MSDN.
Филипп Нган

Я не смог найти Random.Range () в документации MSDN
user2455111

-2

Используйте один экземпляр 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


Randomне потокобезопасный класс. Если вы создаете один экземпляр, вы должны ограничить доступ к нему за механизм блокировки.
Брэд М

-2

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

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

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

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

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

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


Это будет возвращать один и тот же номер, когда он
вызывается

1
randomnumber (0, 999) никогда не вернет 999. Максимальное значение не включено. Это распространенное недоразумение (особенность) максимального значения Random.Next.
Гордон Белл

-2

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

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

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

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

// for example unique name
strName += "_" + new Random().Next(100, 999);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.