Произведите рандомизацию списка < T >

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

1: AKA: используйте PHP-расширение в C, которое делает то, что вы хотите, но это будет означать много программирования для относительно небольшой задачи ,

2: Способ eas [y / ier]: найдите программу (возможно, Skype?), которая может выполнять голосовую связь с вашим модемом и имеет API или CLI, чтобы вы могли запустить PHP: voiceprogram.exe --call=555-000-5555 --saveTo=client1_20113103_1200.mp3 Это позволяет приложению делать то, что хорошо, и использовать только PHP в качестве контроллера. Результирующий MP3 (или Wav, OGG и т. Д.) Можно сохранить обратно в CRM.

3: Другие параметры Если вы можете программировать на другом языке, который легко обменивается данными с вашим модемом, вы можете написать некоторый настраиваемый код, который может быть вызван PHP (сокеты / SOAP / CLI) и обрабатывает вызов. По завершении он может «POST» получить информацию о вызове на ваш PHP-скрипт.

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

762
задан Uwe Keim 3 May 2016 в 13:01
поделиться

7 ответов

Перемешать любой (I) список с помощью метода расширения, основанного на перемешивании Фишера-Йейтса :

private static Random rng = new Random();  

public static void Shuffle<T>(this IList<T> list)  
{  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

Использование:

List<Product> products = GetProducts();
products.Shuffle();

В приведенном выше коде используется часто критикуемый метод System.Random для выбора кандидатов на замену. Это быстро, но не так случайно, как должно быть. Если вам нужно более высокое качество случайности при перемешивании, используйте генератор случайных чисел в System.Security.Cryptography, например:

using System.Security.Cryptography;
...
public static void Shuffle<T>(this IList<T> list)
{
    RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
    int n = list.Count;
    while (n > 1)
    {
        byte[] box = new byte[1];
        do provider.GetBytes(box);
        while (!(box[0] < n * (Byte.MaxValue / n)));
        int k = (box[0] % n);
        n--;
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}

Простое сравнение доступно в этом блоге (WayBack Machine).

Изменить: с момента написания этого ответа пару лет назад многие люди комментировали или писали мне, чтобы указать на большой глупый недостаток в моем сравнении. Конечно, они правы. В System.Random нет ничего плохого, если он используется по назначению. В моем первом примере выше Я создаю экземпляр переменной rng внутри метода Shuffle, который вызывает проблемы, если метод будет вызываться повторно. Ниже приведен фиксированный полный пример, основанный на действительно полезном комментарии, полученном сегодня от @weston здесь, на SO.

Program.cs:

using System;
using System.Collections.Generic;
using System.Threading;

namespace SimpleLottery
{
  class Program
  {
    private static void Main(string[] args)
    {
      var numbers = new List<int>(Enumerable.Range(1, 75));
      numbers.Shuffle();
      Console.WriteLine("The winning numbers are: {0}", string.Join(",  ", numbers.GetRange(0, 5)));
    }
  }

  public static class ThreadSafeRandom
  {
      [ThreadStatic] private static Random Local;

      public static Random ThisThreadsRandom
      {
          get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); }
      }
  }

  static class MyExtensions
  {
    public static void Shuffle<T>(this IList<T> list)
    {
      int n = list.Count;
      while (n > 1)
      {
        n--;
        int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
      }
    }
  }
}
1064
ответ дан 22 November 2019 в 21:19
поделиться

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

В псевдокоде это было бы похоже на это:

do 
    r1 = randomPositionInList()
    r2 = randomPositionInList()
    swap elements at index r1 and index r2 
for a certain number of times
-6
ответ дан Aleris 3 May 2016 в 13:01
поделиться

Я обычно использую:

var list = new List<T> ();
fillList (list);
var randomizedList = new List<T> ();
var rnd = new Random ();
while (list.Count != 0)
{
    var index = rnd.Next (0, list.Count);
    randomizedList.Add (list [index]);
    list.RemoveAt (index);
}
3
ответ дан albertein 3 May 2016 в 13:01
поделиться

Если у Вас есть постоянное число (75), Вы могли бы создать массив с 75 элементами, то перечислить Ваш список, переместив элементы в рандомизированные положения в массиве. Можно генерировать отображение числа списка к индексу массива с помощью перестановка Фишера-Йетса .

3
ответ дан dmo 3 May 2016 в 13:01
поделиться
    public static List<T> Randomize<T>(List<T> list)
    {
        List<T> randomizedList = new List<T>();
        Random rnd = new Random();
        while (list.Count > 0)
        {
            int index = rnd.Next(0, list.Count); //pick a random item from the master list
            randomizedList.Add(list[index]); //place it at the end of the randomized list
            list.RemoveAt(index);
        }
        return randomizedList;
    }
10
ответ дан Adam Tegen 3 May 2016 в 13:01
поделиться

Моим решением является самый короткий путь и простой в использовании:

        public static IEnumerable<TT> Randomize<TT>(this IEnumerable<TT> target) =>
            target.OrderBy(x => new Random().Next());
-1
ответ дан 22 November 2019 в 21:19
поделиться

Метод расширения для IEnumerable:

public static IEnumerable<T> Randomize<T>(this IEnumerable<T> source)
{
    Random rnd = new Random();
    return source.OrderBy<T, int>((item) => rnd.Next());
}
73
ответ дан 22 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

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