Member 13512434 Ответов: 3

Генерация случайных чисел


Я пытаюсь создать случайное число " n " количество раз в зависимости от числа в определенном текстовом поле - так что если текстовое поле говорит 6, то будет шесть случайно сгенерированных чисел.
Код работает, однако одно и то же число дублируется " n "раз вместо того, чтобы иметь" n " разных чисел, и первое поле в элементе checkedlistbox пусто

кто-нибудь может помочь?
{
         Random generator = new Random();
         int r = generator.Next(100);
         string rnd = r.ToString("D3");
         int N = Convert.ToInt32(QuantityTxt.Text);

         for (int i = 0; i <= N; i++)
         {
         checkedListBox3.Text = BarcodeTxt.Text + "-" + rnd;
         checkedListBox3.Text.ToString().Split(',').ToList().ForEach(c => checkedListBox3.Items.Add(c.Trim()));
         }


Что я уже пробовал:

Я пробовал переставлять цифры но ничего не получается

3 Ответов

Рейтинг:
13

OriginalGriff

phil.o прав: ваш код повторно использует одну и ту же переменную каждый раз.

for (int i = 0; i <= N; i++)
    {
    checkedListBox3.Text = BarcodeTxt.Text + "-" + rnd; //<<<--- THIS VALUE NEVER CHANGES INSIDE THE LOOP.
    checkedListBox3.Text.ToString().Split(',').ToList().ForEach(c => checkedListBox3.Items.Add(c.Trim()));
    }
Поэтому первое, что нужно сделать, это переместить код генерации случайных чисел в цикл:
for (int i = 0; i <= N; i++)
    {
    int r = generator.Next(100);
    string rnd = r.ToString("D3");
    checkedListBox3.Text = BarcodeTxt.Text + "-" + rnd; //<<<--- THIS VALUE NEVER CHANGES INSIDE THE LOOP.
    checkedListBox3.Text.ToString().Split(',').ToList().ForEach(c => checkedListBox3.Items.Add(c.Trim()));
    }
Но... это какой-то странный код!
Вы устанавливаете текст listbox на другое значение каждый раз вокруг цикла. Это нормально - но это выглядит странно - он оставит окончательное значение в списке.
Затем вы получаете только что заданное значение, преобразуете его в строку (которая уже есть), разбиваете его на массив по символу, который является частью строки, которая не изменяется внутри цикла, преобразуете этот массив в список - что вам не нужно делать, потому что массив имеет свой собственный Foreach:
string[] data = { "hello", "there" };
data.ToList().ForEach(s => Console.WriteLine(s));
Array.ForEach(data, s => Console.WriteLine(s));
Последние две строки равнозначны, но последнее не означает создания новых и ненужных структур данных.
А затем вы добавляете их все в свой список.

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

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

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


CPallini

5.

Maciej Los

5ed!

Рейтинг:
1

phil.o

Вы должны переместить часть случайной генерации в цикл, если вы хотите, чтобы новое случайное число генерировалось на каждой итерации. Здесь вы генерируете случайное число перед циклом, поэтому очевидно, почему вы получаете одно и то же число. Он не дублируется, это один и тот же номер, который вы используете снова и снова.


CPallini

5.

Maciej Los

5ed!

Рейтинг:
1

Maciej Los

Если вы хотите получить 6 случайных чисел от 1 до 100, попробуйте сделать это:

//limit to 6 numbers
int limit = 6;
//Random.Next maxValue is exclusive upper bound of the random number returned, so we need to add 1
int cnt = 101;
//generate list if integers: 1 to 300 
List<int> numbers = Enumerable.Range(1,300).ToList();
//start randomize
Random rnd = new Random();
//get random numbers
var randomseq = numbers.Select(n=>n=rnd.Next(1,cnt)).Distinct().Take(limit).ToList();


Для получения более подробной информации, пожалуйста, смотрите: Случайный.Следующий Метод (Int32, Int32) (Система)[^]


Примечание: этот метод не очень эффективен. Благодаря Ф-Эс компания[^ за ценный комментарий.


CPallini

5.

Maciej Los

Спасибо, Карло.

F-ES Sitecore

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

Maciej Los

Да, вы правы, но ОП не определил критерии для алгоритма. Предоставьте свой алгоритм и возьмите от меня 5 звезд ;)
Овации,
Мацей