Неповторяющееся случайное число

Angular по-прежнему советует не использовать трубы для сортировки и фильтрации, как в angularJs.

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

Причина объяснена на https://angular.io/guide/pipes#no-filter-pipe

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

 @Input()
  set users(users: Array) {
    this.usersResult = (users || []).sort((a: User, b: User) => a.name < b.name ? -1 : 1)
  }

8
задан John Saunders 1 March 2014 в 23:31
поделиться

4 ответа

Что именно вы имеете в виду под «не должно повторяться»? Если вы имеете в виду, что не хотите получать какие-либо дубликаты, то вам следует взять список чисел 1-20, перемешать их, а затем возьмите по одному из начала списка. Для эффективного способа перемешать список см. этот ответ на переполнение стека .

Если вы просто имеете в виду, что ваша текущая попытка дает 5, 5, 5, 5, 5, 5, 1, 1, 1 , 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 и т. Д., Тогда есть вероятность, что вы создаете новый экземпляр Random каждый раз, когда выбираете число: не делайте этого который. Каждый раз, когда вы создаете экземпляр, он будет использовать текущее время в качестве «начального числа» для генератора случайных чисел (если вы не укажете его явно). Это означает, что если вы создаете несколько экземпляров в быстрой последовательности, каждый получит одно и то же начальное число и, следовательно, даст одну и ту же последовательность чисел.

Вместо этого используйте один экземпляр Random и повторно используйте его. (Обратите внимание, что это не потокобезопасный вариант, что очень неприятно.) Например:

private static readonly Random Rng = new Random();

public int NextNumber()
{
    return Rng.Next(20) + 1;
}

Это победило ' t быть потокобезопасным, но дайте нам знать, если это проблема. Альтернативой может быть передача Random в метод (что, конечно, было бы сложнее):

public int NextNumber(Random rng)
{
    return rng.Next(20) + 1;
}

тогда вызывающий может повторно использовать экземпляр соответствующим образом.

Если вам нужен поток - безопасный способ генерации случайных чисел, вы можете посмотреть мой класс StaticRandom в MiscUtil .

(Обратите внимание, что использование rng.Next (1, 21) тоже будет работать нормально - я предпочитаю версию выше, поскольку я думаю, что она уменьшает количество догадок о включающих / исключающих границах, но это вопрос личного вкуса.)

22
ответ дан 5 December 2019 в 04:46
поделиться

Этот метод сгенерирует все числа, и никакие числа не будут повторяться:

/// <summary>
/// Returns all numbers, between min and max inclusive, once in a random sequence.
/// </summary>
IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
    List<int> candidates = new List<int>();
    for (int i = minInclusive; i <= maxInclusive; i++)
    {
        candidates.Add(i);
    }
    Random rnd = new Random();
    while (candidates.Count > 0)
    {
        int index = rnd.Next(candidates.Count);
        yield return candidates[index];
        candidates.RemoveAt(index);
    }
}

Вы можете использовать это так:

Console.WriteLine("All numbers between 0 and 20 in random order:");
foreach (int i in UniqueRandom(0, 20)) {
    Console.WriteLine(i);
}
18
ответ дан 5 December 2019 в 04:46
поделиться

Из MSDN

«Один из способов улучшить случайность - сделать начальное значение зависящим от времени»

Еще один факт

: вы должны «создать один случайный элемент для генерации множества случайных числа с течением времени ". Это улучшит случайную генерацию

0
ответ дан 5 December 2019 в 04:46
поделиться

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

List<int> integers = new List<int>() { 1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12 };

Random rnd = new Random();

var ints = from i in integers
           orderby rnd.Next(integers.Count)
           select i;
1
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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