2009-12-07 21 views
6

Tôi muốn tạo 10 số khác nhau trong phạm vi từ 0-9. các đầu ra mong muốn có thể trông như thế này, 9 0 8 6 5 3 2 4 1 7Các số khác nhau từ 1 đến 10

Dim arraynum(9) As Integer 
Dim crmd As Boolean 
Dim rmd as integer 

For i = 0 To 9 
    arraynum(i) = -1 
Next i 

crmd = True 
Randomize Timer 
For i = 0 To 9 
    rmd = Int(Rnd * 10) 
    For j = 0 To 9 
     If arraynum(j) = rmd Then 
      j = 9 
      If crmd = False Then 
       i = i - 1 
      End If 
      crmd = True 
     Else 
      crmd = False 
     End If 
    Next j 
    If crmd = False Then 
     arraynum(i) = rmd 
     QuestionILabel.Caption = QuestionILabel.Caption + Str(arraynum(i)) 
    End If 
Next i 
+2

vui lòng làm ơn RTFM - (nói cách khác, bạn đã thử những gì cho đến nay, v.v., v.v.). Chúng tôi không chỉ làm bài tập ở nhà của bạn cho bạn: ( – KevinDTimm

+0

làm cách nào để đăng mã của tôi ở đây? – gibz357

+0

Khi bạn chỉnh sửa câu hỏi của mình - nhìn sang bên phải: 'Cách định dạng': • mã thụt lề bằng 4 dấu cách – tanascius

Trả lời

12

Chọn giá trị ngẫu nhiên và sau đó ném đi những người mà bạn đã sử dụng là một xấu ý tưởng . Nó làm cho thời gian chạy lâu hơn khi số lượng các số có sẵn ít hơn vì bạn đang ném đi nhiều hơn và nhiều hơn nữa.

Những gì bạn muốn là một danh sách ngẫu nhiên mà tôi sẽ thực hiện với đoạn mã sau (pseudo-code từ bài tập về nhà của nó):

dim n[10]     // gives n[0] through n[9] 
for each i in 0..9: 
    n[i] = i    // initialize them to their indexes 
nsize = 10    // starting pool size 
do 10 times: 
    i = rnd(nsize)  // give a number between 0 and nsize-1 
    print n[i] 
    nsize = nsize - 1  // these two lines effectively remove the used number 
    n[i] = n[nsize] 

Bằng cách chọn một số ngẫu nhiên từ hồ bơi sau đó thay thế nó bằng đầu số từ hồ bơi đó và giảm kích thước của hồ bơi, bạn nhận được một shuffle mà không cần phải lo lắng về một số lượng lớn các hoán đổi lên phía trước. Điều này là quan trọng nếu số lượng cao ở chỗ nó không giới thiệu một sự chậm trễ khởi động không cần thiết.

Ví dụ, kiểm tra băng ghế dự bị kiểm tra như sau:

<--------- n[x] ----------> 
for x = 0 1 2 3 4 5 6 7 8 9 nsize rnd(nsize) output 
--------------------------- ----- ---------- ------ 
     0 1 2 3 4 5 6 7 8 9  10   4  4 
     0 1 2 3 9 5 6 7 8  9   7  7 
     0 1 2 3 9 5 6 8   8   2  2 
     0 1 8 3 9 5 6   7   6  6 
     0 1 8 3 9 5    6   0  0 
     5 1 8 3 9    5   2  8 
     5 1 9 3     4   1  1 
     5 3 9     3   0  5 
     9 3      2   1  3 
     9      1   0  9 

Bạn có thể xem hồ giảm khi bạn đi và, bởi vì bạn luôn thay thế sử dụng một với một ai không sử dụng, bạn sẽ không bao giờ có lặp lại.

tại bài tập ở nhà của bạn bao gồm biến đó vào VB :-)


Và, vì bài tập về nhà này bây giờ là gần như chắc chắn quá hạn (khoảng một năm trước), tôi sẽ đăng một giải pháp VBA cho thấy làm thế nào để làm điều đó, cho đầy đủ.

Option Explicit 
Option Base 0 
Sub Macro1() 
    Randomize 
    Dim list(10) As Integer 
    Dim i As Integer 
    Dim size As Integer 
    Dim pos As Integer 
    Dim result As String 

    For i = 0 To 9 
     list(i) = i 
    Next 

    size = 10 
    result = ":" 
    For i = 1 To 10 
     pos = Int(Rnd() * size) 
     result = result & list(pos) & ":" 
     size = size - 1 
     list(pos) = list(size) 
    Next 

    MsgBox result 
End Sub 

này tạo ra, trên ba chạy riêng biệt:

:5:7:4:2:9:1:0:8:3:6: 
:3:9:6:0:7:8:5:4:2:1: 
:7:6:3:5:1:8:9:0:4:2: 
+0

lỗi trên một số ngẫu nhiên 0 – gibz357

+0

Bạn đang sử dụng 'i' làm bộ đếm vòng lặp và sau đó để lưu trữ các giá trị ngẫu nhiên bên trong vòng lặp - hãy chạy nó bằng cách lưu trữ số ngẫu nhiên trong một' int j; 'và thay thế' i' bằng ' j' bên trong vòng lặp. 1 cho thuật toán. Có tên cụ thể nào cho điều này không? – Amarghosh

+0

Tìm thấy tên - Fisher-Yates shuffle. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – Amarghosh

1

bạn cần một hoán vị ngẫu nhiên trên một mảng từ 0 đến 9.

Tôi quên cách viết cơ bản .. cái gì đó như:

dim a(10) 
for i=0 to 9 do a(i) = i 
rem do random permute over a: 
for i=0 to 9 do 
    j = rand() mod (i+1) 
    tmp = a(j) 
    a(i) = a(j) 
    a(j) = tmp 
next i 
+0

+1 Bạn cũng nên làm mờ các biến i, j, tmp nếu 'Option Explicit' được sử dụng –

+1

Một số lý thuyết: http://stackoverflow.com/questions/ 910215/máy phát ngẫu nhiên có thể dự đoán được/910340 # 910340 - xem liên kết túi xáo trộn. – tanascius

-1
Option Explicit 'Force variable declaration 

Private Sub Form_Load() 
    Dim Ar(1 To 100) As Integer 'The array to store it in 
    Dim i, j As Integer 'Counters for loops 
    Dim X As Integer 'Variable to store the random generated number 
    Dim bFound As Boolean 'Boolean to check if the value has been generated before 

    Randomize 'Just once to ensure that we get random values 

    For i = 1 To 100 
     Do 'Start the loop that generates a random number and checks if it has already been generated 
      X = RandomInteger(1, 100) 'Generate a random number 
      bFound = False 'Set the boolean to false, if we find the number while searching the array, we'll set it to true which means that we already have that number 
      For j = 1 To i 'We only need to check up to i (since we haven't put any values in the rest of the array) 
       If Ar(j) = X Then 'If an item of the arrray is the same as the last generated number 
        bFound = True 'Set the boolean to true (it already exists) 
        DoEvents 'To not freeze until the looping is done 
        Exit For 'Since we found it there is no need to check the rest 
       End If 
      Next 
     Loop Until bFound = False 'If it wasn't found then we'll add it, if it was found then we go back to generating a new number and comparing it with all the items of the array 
     Ar(i) = X 'Add it to the array 
    Next 

    ShowInTextBox Text1, Ar 'Just to print the data and see it 
End Sub 

Private Function RandomInteger(Lowerbound As Integer, Upperbound As Integer) As Integer 'The random number generator code 
    RandomInteger = Int((Upperbound - Lowerbound + 1) * Rnd + Lowerbound) 
End Function 

Private Sub ShowInTextBox(TB As TextBox, A() As Integer) 'Just a sub to show the data in a textbox 
    Dim i As Integer 

    TB.Text = "" 

    For i = 1 To UBound(A) 
     TB.Text = TB.Text & CStr(A(i)) & vbCrLf 
    Next 

    TB.Text = Left$(TB.Text, Len(TB.Text) - 2) 
End Sub 
+2

Đây chính xác là giải pháp tương tự như OP và đã được cho biết đó là một ý tưởng tồi (do phải kiểm tra hồ bơi fintie). Shuffle là một giải pháp tốt hơn nhiều. – Deanna

-1

Đây là mã đơn giản nhưng làm việc. Ngoài ra không có API!

Dim a(1 To 10), tmp, count, isRepeated 
count = 1 
Randomize 
While count <= 10 
    isRepeated = False 
    tmp = Left(Rnd * 10, 1) 
    For i = 1 To 10 
     If tmp = a(i) Then isRepeated = True: Exit For 
    Next 
    If isRepeated = False Then a(count) = tmp: count = count + 1 
Wend 
YourLine = Join(a, "") 

Và đó là tất cả mọi người !!

+0

@ Deanna, Xin lỗi, có rất nhiều lỗi. Bây giờ tôi đã sửa chúng. Xin vui lòng, loại bỏ ý kiến ​​của bạn :) – Searush

+0

Đây là giải pháp tương tự được đưa ra trong [câu trả lời này] (http://stackoverflow.com/a/11928969/588306) đó là chính xác những gì OP đã cố gắng để tránh. Downvote của tôi vẫn đứng. – Deanna

Các vấn đề liên quan