Как создать уникальное случайное число в диапазоне, не повторяя число в C # [дубликат]

У вас может быть библиотека JAR, скомпилированная в Java 7, и у вас есть только Java 6 как Java Runtime. Это может случиться с некоторыми новыми библиотеками.

0
задан Reginwaldt Led 3 May 2015 в 14:24
поделиться

10 ответов

Проверьте каждый номер, который вы генерируете, на предыдущие цифры:

List<int> listNumbers = new List<int>();
int number;
for (int i = 0; i < 6; i++)
{
  do {
     number = rand.Next(1, 49);
  } while (listNumbers.Contains(number));
  listNumbers.Add(number);
}

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

List<int> possible = Enumerable.Range(1, 48).ToList();
List<int> listNumbers = new List<int>();
for (int i = 0; i < 6; i++)
{
  int index = rand.Next(0, possible.Count);
  listNumbers.Add(possible[index]);
  possible.RemoveAt(index);
}
4
ответ дан Guffa 21 August 2018 в 03:18
поделиться
  • 1
    Почему нисходящий? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa 3 May 2015 в 14:33
  • 2
    Я не ответил на ваш ответ, но ваше первое решение кажется немного беспорядочным. Хотя это будет работать, я думаю, что лучше изменить цикл for на цикл while, как в моем ответе. – Zohar Peled 3 May 2015 в 14:37
  • 3
    они оба работают благодаря – Reginwaldt Led 3 May 2015 в 14:38
  • 4
    @ ZoharPeled: Это всего лишь два разных подхода. Ни то, ни другое лучше другого. – Guffa 3 May 2015 в 14:40
  • 5
    @ Гуффа, я не согласен. Я не вижу достаточной причины для вставки цикла while в цикл for. В этом случае я считаю, что производительность по нашим предложениям будет, вероятно, эквивалентной, но я думаю, что только цикл while более читабельен. – Zohar Peled 3 May 2015 в 14:43

Что вы делаете, так это генерировать случайное число каждый раз в цикле. Конечно, есть вероятность, что следующее случайное число может быть таким же, как и предыдущее. Просто добавьте одну проверку, что текущее случайное число отсутствует в последовательности. Вы можете использовать цикл while: while (currentRandom not in listNumbers): generateNewRandomNumber

0
ответ дан Anton Belev 21 August 2018 в 03:18
поделиться

Вместо использования списка вы должны использовать HashSet. HashSet & lt;> запрещает несколько одинаковых значений. И метод Add возвращает bool, который указывает, был ли элемент добавлен в список. Ниже приведен пример кода ниже.

public static IEnumerable<int> GetRandomNumbers(int count)
{
HashSet<int> randomNumbers = new HashSet<int>();

for (int i = 0; i < count; i++) 
    while (!randomNumbers.Add(random.Next()));

return randomNumbers;
}
0
ответ дан BSG 21 August 2018 в 03:18
поделиться

Сделайте цикл while и добавьте целые числа в хешсет. Остановите цикл, когда у вас шесть целых чисел.

1
ответ дан idstam 21 August 2018 в 03:18
поделиться
  • 1
    Это интересная идея, но нет хорошего способа получить значения из хеш-набора. Порядок элементов в хэш-наборе не определен, поэтому вы можете получить их в порядке, который зависит от значения, а не от того, в каком порядке они были добавлены. – Guffa 3 May 2015 в 14:36
  • 2
    Добавьте каждый номер в список возврата, поскольку они добавляются в хэш, если сгенерированный порядок важен. – idstam 3 May 2015 в 17:25
  • 3
    Порядок определенно важен. Если элементы перегруппированы в зависимости от значения, список больше не случайный. Простое добавление номеров в список означает, что список может содержать дубликаты. Вам нужно будет проверить, существует ли номер в хэш-наборе, чтобы определить, следует ли его добавить в список или нет. – Guffa 3 May 2015 в 17:39
  • 4
    Да, когда вы добавляете их в хэш, вы получаете true / false, чтобы указать, удалось ли добавить. Не нужно смотреть в хэш. – idstam 3 May 2015 в 17:52
  • 5
    Правильно, вы могли бы проверить это так, я об этом не думал. :) – Guffa 3 May 2015 в 20:08

Вставьте ниже в классе новый метод

    public int randomNumber()
    {
        var random = new Random();
        int randomNumber = random.Next(10000, 99999);
        return randomNumber;
    }

И используйте ниже в любом месте тестов, где необходимо

var RandNum = random1umber ();

driver.FindElement (By.CssSelector ("[class = 'test']")) SendKeys (RandNum);

0
ответ дан Kumar K 21 August 2018 в 03:18
поделиться

Наилучший подход (по времени процессора) для таких задач - создание массива всех возможных чисел и извлечение из него 6 элементов при удалении элемента, который вы только что взяли из массива. Пример:

const int min = 1, max = 49;
List<int> listNumbers = new List<int>();
int[] numbers = new int[max - min + 1];
int i, len = max - min + 1, number;

for (i = min; i < max; i++) numbers[i - min] = i;
for (i = 0; i < 6; i++) {
    number = rand.Next(0, len - 1);
    listNumbers.Add(numbers[number]);
    if (number != (len - 1)) numbers[number] = numbers[len - 1];
    len--;
}
0
ответ дан mephisto123 21 August 2018 в 03:18
поделиться
   public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int[] que = new int[6];
        int x, y, z;
        Random ran = new Random();            
        for ( x = 0; x < 6; x++)
        {
            que[x] = ran.Next(1,49);
            for (y = x; y >= 0; y--)
            {
                if (x == y)
                {
                    continue;
                }
                if (que[x] == que[y])
                {
                    que[x] = ran.Next(1,49);
                    y = x;
                }


            }
        }
        listBox1.Items.Clear();
        for (z = 0; z < 6**strong text**; z++)
        {
            listBox1.Items.Add(que[z].ToString());
        }
    }
}
-1
ответ дан mr.mdo 21 August 2018 в 03:18
поделиться
  • 1
    Измените свой ответ, чтобы пояснить, что вы сделали и почему – bc004346 9 March 2017 в 19:38

Создайте HashSet и создайте уникальные случайные числа

public List<int> GetRandomNumber(int from,int to,int numberOfElement)
{
    var random = new Random();
    HashSet<int> numbers = new HashSet<int>();
    while (numbers.Count < numberOfElement)
    {
        numbers.Add(random.Next(from, to));
    }
    return numbers.ToList();
}
0
ответ дан Sathish 21 August 2018 в 03:18
поделиться
listNumbers.AddRange(Enumerable.Range(1, 48)
                               .OrderBy(i => rand.Next())
                               .Take(6))
2
ответ дан user 21 August 2018 в 03:18
поделиться
  • 1
    Перетасовка, упорядочивая случайное число, не очень хороший метод, вместо этого вы должны использовать Shuffle Fisher-Yates. Случается, что в этом случае LINQ кэширует значения, которые он получает от предиката, но для других реализаций сортировки он не будет работать должным образом. – Guffa 3 May 2015 в 14:32
  • 2

Я включил цикл for с циклом do ... while и установил условие остановки в списке меньше, чем 6. Это может быть не лучшее решение, но оно ближе всего к вашему исходному коду.

List<int> listNumbers = new List<int>();
do
    {
        int numbers = rand.Next(1,49);
        if(!listNumbers.Contains(number)) {
            listNumbers.Add(numbers);
        }
    } while (listNumbers.Count < 6)
0
ответ дан Zohar Peled 21 August 2018 в 03:18
поделиться
  • 1
    Это не самый близкий к исходному коду. Проверьте мой ответ на решение, которое ближе к исходному коду. – Guffa 3 May 2015 в 15:17
  • 2
    Ну, ты меня туда :-) – Zohar Peled 3 May 2015 в 15:18
Другие вопросы по тегам:

Похожие вопросы: