Существует ли простой способ рандомизировать список в VB.NET?

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

const
    transpose = array => array.reduce((r, a) => a.map((v, i) => [...(r[i] || []), v]), []),
    array = [{ fromX: { id: 1 }, toX: { id: 2 } }, { fromX: { id: 3 }, toX: { id: 4 } }],
    keys = ['fromX', 'toX'],
    [fromX, toX] = transpose(array.map(o => keys.map(k => o[k].id)));

console.log(fromX);
console.log(toX);

6
задан Mihai Limbășan 22 March 2009 в 16:52
поделиться

7 ответов

Создайте компаратор:

Public Class Randomizer(Of T)
    Implements IComparer(Of T)

    ''// Ensures different instances are sorted in different orders
    Private Shared Salter As New Random() ''// only as random as your seed
    Private Salt As Integer
    Public Sub New()
        Salt = Salter.Next(Integer.MinValue, Integer.MaxValue)
    End Sub

    Private Shared sha As New SHA1CryptoServiceProvider()
    Private Function HashNSalt(ByVal x As Integer) As Integer
      Dim b() As Byte = sha.ComputeHash(BitConverter.GetBytes(x))
      Dim r As Integer = 0
      For i As Integer = 0 To b.Length - 1 Step 4
          r = r Xor BitConverter.ToInt32(b, i)
      Next

      Return r Xor Salt
    End Function

    Public Function Compare(x As T, y As T) As Integer _
        Implements IComparer(Of T).Compare

        Return HashNSalt(x.GetHashCode()).CompareTo(HashNSalt(y.GetHashCode()))
    End Function
End Class

Используйте его как это, предполагая значение дженерика List(Of FileInfo):

list.Sort(New Randomizer(Of IO.FileInfo)())

Можно также использовать закрытие, чтобы сделать случайное значение 'липким' и затем просто использовать.OrderBy linq () на том (C# на этот раз, потому что синтаксис лямбды VB ужасен):

list = list.OrderBy(a => Guid.NewGuid()).ToList();

Объясненный здесь, наряду с тем, почему это даже не могло бы быть с такой скоростью, как реальная перестановка:
http://www.codinghorror.com/blog/archives/001008.html?r=31644

2
ответ дан 8 December 2019 в 05:58
поделиться

Проверьте алгоритм перестановки Фишера-Йетса здесь: http://en.wikipedia.org/wiki/Knuth_shuffle

с более кратким обсуждением главным повелителем этого сайта здесь: http://www.codinghorror.com/blog/archives/001015.html

Существует простая реализация C# в записи в блоге, которую должно быть очень легко изменить на VB.NET

14
ответ дан 8 December 2019 в 05:58
поделиться

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

1
ответ дан 8 December 2019 в 05:58
поделиться

Существует несколько разумных методов перестановки.

Каждый был уже упомянут. (Перестановка Knuth.)

Другой метод должен был бы присвоить "вес" каждому элементу и отсортировать список согласно тому "весу". Этот метод является возможным, но был бы громоздким, потому что Вы не можете наследоваться FileInfo.

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


        Dim rnd As New Random
        Dim lstOriginal As New List(Of FileInfo)
        Dim lstNew As New List(Of FileInfo)

        While lstOriginal.Count > 0
            Dim idx As Integer = rnd.Next(0, lstOriginal.Count - 1)
            lstNew.Add(lstOriginal(idx))
            lstOriginal.RemoveAt(idx)
        End While
2
ответ дан 8 December 2019 в 05:58
поделиться

Если у Вас есть число элементов затем, псевдослучайный метод может использоваться, посредством чего Вы выбираете первый элемент наугад (например, использование встроенной функции случайного числа) затем добавляют начало и берут остаток после деления количеством значений. например, для списка 10 Вы могли сделать меня = (я + главный) % 10 к сгенерированным индексам i от некоторого начального значения. Пока начало больше, чем количество значений в списке затем, Вы создаете последовательность, которая пробегает все числа 0... n, где n является количеством значений - 1, но в псевдослучайном порядке.

0
ответ дан 8 December 2019 в 05:58
поделиться
Dim oRand As New Random() 'do not seed!!!!
Private Sub GetRandom(ByRef currentVals As List(Of Integer))
    Dim i As New List(Of Integer), j As Integer
    For x As Integer = 0 To currentVals.Count - 1
        j = oRand.Next(0, currentVals.Count)
        i.Add(currentVals(j))
        currentVals.RemoveAt(j)
    Next
    currentVals = i
End Sub
0
ответ дан 8 December 2019 в 05:58
поделиться

Вы могли создать пользовательский компаратор, который просто возвращает случайное число, затем отсортируйте список с помощью этого компаратора. Это могло быть ужасно неэффективно и вызвать почти бесконечный цикл, но могло бы стоить попытки.

-2
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

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