było wiele postów na ten temat, ale wydaje się, że nikt nie ma mojego problemu.
Mam pole listy z literami a-z (linia dla każdej litery)
za pomocą
Dim rancon As New Random
Dim rc As Integer = ListBox1.Items.Count
Label5.Text = lcon.Items.Item(rancon.Next(rc)).ToString
wszystko wybiera losowo, 1 z pierwszych 7 lub 8 znaków.
czy ktoś może doradzić?
Odpowiedzi:
1 dla odpowiedzi № 1Zakładam, że spodziewasz się, że losowy zawsze wybiera inny element w ListBox
. Dlatego musisz ponownie użyć tego samego Random
instancja, ponieważ wywodzi się z domyślnego konstruktoraziarno (które jest używane do inicjalizacji generatora liczb pseudolosowych) z bieżącego czasu systemowego. Jeśli wywołasz ten kod bardzo szybko (na przykład w pętli), ziarno będzie zawsze takie samo. Stąd otrzymujesz powtarzające się liczby / przedmioty.
Aby tego uniknąć, możesz zrobić Random
pole w klasie:
Private rancon As New Random
Public Sub YourMethod()
Dim rc As Integer = ListBox1.Items.Count
Label5.Text = ListBox1.Items(rancon.Next(rc)).ToString()
End Sub
MSDN:
Domyślna wartość początkowa to pochodzi z zegara systemowego i ma skończone rozkład. W rezultacie powstają różne losowe obiekty ścisła sukcesja wywołana przez domyślny konstruktor będzie miała identyczne domyślne wartości nasion i dlatego będą identyczne zestawy liczb losowych. Tego problemu można uniknąć, używając apojedynczy Losowy obiekt do generowania wszystkich liczb losowych. Możesz także obejść modyfikując wartość początkową zwracaną przez zegar systemowy, a następnie jawne podanie tej nowej wartości początkowej losowej (Int32) konstruktor.
Zauważ, że ja też użyłem ListBox1.Items
zamiast lcon.Items
na wypadek, gdyby to była literówka.