2015-11-04 3 views
0

Я новичок в этом. Я хочу создать массив из 16 элементов. Предположим, что мой массив является ReDim arr (15) как Integer, и в этом массиве я хочу поместить числа от 1 до 16, но скремблирован, например arr (0) = 3, arr (5) = 8 и т. Д.Как создать массив со случайными числами?

+0

'обр (15)' дает вам только 15 элементов. – findwindow

+1

Итак ... вы что-то пробовали –

+2

'arr (15)' (aka 'arr (от 0 до 15)') дает 16 элементов. – Jeeped

ответ

1

Вот некоторые очень ленивый код:

Dim arr(15) As Integer 
Dim i As Integer, j As Integer 
i = 1 
Do 
    j = Int(16 * Rnd) 
    If arr(j) = 0 Then 
     arr(j) = i 
     i = i + 1 
    End If 
Loop Until i = 17 

Rnd генерирует single от 0 до 1, умножить на 16 и полосы десятичной части с Int, и это даст вам случайное число от 0 до 15 .

Это неэффективно, я бы не использовал его в производстве, но он выполнит эту работу.

Надеюсь, это поможет!

+0

Нет, это не так, я думал об этом в этом коде. Если функция rnd возвращает значение, которое уже было использовано, оно просто перезапустит цикл. –

+0

Вы правы, я прошу прощения и удалю свой комментарий. Я пропустил заявление if. Это отлично подходит для запрошенного небольшого подмножества. Мне было бы интересно узнать среднее число циклов, чтобы они были заполнены. По разногласиям есть вероятность бесконечного цикла, если подмножество получилось большим. Это не то, что было задано, и эта небольшая часть подмножества не имела бы такого риска. –

+1

Да, как я уже сказал, это не очень хороший код, но он выполнит эту работу, и вы только собираетесь использовать его для небольших наборов. Я побежал его 500 раз, и потребовалось в среднем 35 циклов, но все 500 заняли меньше секунды, поэтому я не слишком волнуюсь. Если бы это был код для серьезного производства, я бы написал его правильно. –

1

Дайте этому попытку:

Sub MAIN() 
    Dim ary(1 To 16) As Variant 
    Dim i As Long, msg As String 

    For i = 1 To 16 
     ary(i) = i 
    Next i 

    Call Shuffle(ary) 

    msg = "" 
    For i = 1 To 16 
     msg = msg & vbCrLf & ary(i) 
    Next i 
    MsgBox msg 
End Sub 

Sub Shuffle(InOut() As Variant) 
    Dim HowMany As Long, i As Long, J As Long 
    Dim tempF As Double, temp As Variant 

    Hi = UBound(InOut) 
    Low = LBound(InOut) 
    ReDim Helper(Low To Hi) As Double 
    Randomize 

    For i = Low To Hi 
     Helper(i) = Rnd 
    Next i 


    J = (Hi - Low + 1) \ 2 
    Do While J > 0 
     For i = Low To Hi - J 
      If Helper(i) > Helper(i + J) Then 
      tempF = Helper(i) 
      Helper(i) = Helper(i + J) 
      Helper(i + J) = tempF 
      temp = InOut(i) 
      InOut(i) = InOut(i + J) 
      InOut(i + J) = temp 
      End If 
     Next i 
     For i = Hi - J To Low Step -1 
      If Helper(i) > Helper(i + J) Then 
      tempF = Helper(i) 
      Helper(i) = Helper(i + J) 
      Helper(i + J) = tempF 
      temp = InOut(i) 
      InOut(i) = InOut(i + J) 
      InOut(i + J) = temp 
      End If 
     Next i 
     J = J \ 2 
    Loop 
End Sub 

enter image description here

Смежные вопросы