Vb.net хочет использовать словарь, как хэш-таблица в Perl - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть следующий код в Perl, который генерирует случайные значения, пока не будет достигнуто количество значений. В Hashtable всегда хранятся случайные значения в одном и том же «месте», поэтому при хранении достаточно больших значений Hashtable имеет правильный размер

while ( (keys( %unique_regex )) <= $amount_regex){
    $unique_regex{ $pass->randregex($regex) } = '1';
}

Теперь я хочу сделать то же самое в vb.net со словарем, но мне нужно установить ключ, чтобы значения были несколько раз в моей хеш-таблице / dict.

 Dim myDict As New Dictionary(Of Integer, String)
 myDict.Add(0, CStr(Math.Round((((Rnd() Mod 3) * ((input_zufallszahl_obergrenze_1.Value) - input_zufallszahl_untergrenze_1.Value)) + ((input_zufallszahl_untergrenze_1.Value))), 0)))


 Dim tmphashcounter As Integer = 1
 While (myDict.Count <= array_integerzahlen.GetLength(0))

     myDict.Add(tmphashcounter, CStr(Math.Round((((Rnd() Mod 3) * ((input_zufallszahl_obergrenze_1.Value) - input_zufallszahl_untergrenze_1.Value)) + ((input_zufallszahl_untergrenze_1.Value))), 0)))
     tmphashcounter = tmphashcounter + 1

 End While

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

В .NET вы бы не использовали словарь для этого, вы бы использовали HashSet:

Dim mySet As New HashSet(Of Integer)()
Dim lower = input_zufallszahl_untergrenze_1.Value
Dim upper = input_zufallszahl_obergrenze_1.Value
Dim rng As New Random()

Do While mySet.Count < DesiredSize
    mySet.Add(rng.Next(lower, upper))
Loop

Ваше поколение случайных чисел также имеет серьезные недостатки. Помимо очевидных недостатков (что там делает CStr), вам, вероятно, следует отказаться от использования Rnd в пользу правильного генератора случайных чисел, а генерация чисел с помощью Mod 3 вводит тяжелое смещение в случайных числах - они даже более равномерно не распределены. Вот для чего существует метод Random.Next.

Обратите внимание, что фактический код для добавления случайных чисел имеет длину всего три строки - точно так же, как ваш код Perl.

2 голосов
/ 03 ноября 2011

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

While myDict.Count <= array_integerzahlen.GetLength(0)
    randRegex = pass.randRegex( regex )
    If Not myDict.ContainsKey( randRegex )
        myDict.Add( randRegex, 1 )
    End If
End While

Конечно, поскольку вы указываете, что это .NET, вам просто нужно использовать свойство индексации.Я должен думать, что это может работать:

While myDict.Count <= array_integerzahlen.GetLength(0)
    myDict( pass.randRegex( regex )) = True
End While
...