Всем доброго дня! 60 вопросов для тестирования, для которых генератор случайных чисел строит последовательность выпадения вопросов в тесте. Для тестирования отбирается только первые 20 вопросов, с номером сгенерированной последовательности от 1 до 20. Вопросы разделены на два блока 1-30 и 31-60. Все было ничего, пока руководство не возжелало, чтобы вопросы гарантированно выпадали в тест из двух блоков с соотношением 50/50. И тут я "вперся"), никак не придет в голову нужный алгоритм. все что пришло в голову не даст результата или приведет к зацикливанию вплоть до бесконечности. Может быть вы сможете подсказать верное направление. [vba]
Код
Sub RandomData()
Dim a(1 To 60) As Byte, k As Byte, i As Byte, sluch As Byte, xxx As Byte
With Application .Calculation = xlCalculationManual .ScreenUpdating = False End With
For xxx = 2 To 5 For i = 1 To 60 If i > 0 Then a(i) = i Next
For i = 1 To 60 sluch = Int(Rnd() * 60 + 1) k = a(i): a(i) = a(sluch): a(sluch) = k Next
For i = 1 To 60
SH1.Cells(i, xxx) = a(i)
Next i Next xxx
With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With
End Sub
[/vba]
Всем доброго дня! 60 вопросов для тестирования, для которых генератор случайных чисел строит последовательность выпадения вопросов в тесте. Для тестирования отбирается только первые 20 вопросов, с номером сгенерированной последовательности от 1 до 20. Вопросы разделены на два блока 1-30 и 31-60. Все было ничего, пока руководство не возжелало, чтобы вопросы гарантированно выпадали в тест из двух блоков с соотношением 50/50. И тут я "вперся"), никак не придет в голову нужный алгоритм. все что пришло в голову не даст результата или приведет к зацикливанию вплоть до бесконечности. Может быть вы сможете подсказать верное направление. [vba]
Код
Sub RandomData()
Dim a(1 To 60) As Byte, k As Byte, i As Byte, sluch As Byte, xxx As Byte
With Application .Calculation = xlCalculationManual .ScreenUpdating = False End With
For xxx = 2 To 5 For i = 1 To 60 If i > 0 Then a(i) = i Next
For i = 1 To 60 sluch = Int(Rnd() * 60 + 1) k = a(i): a(i) = a(sluch): a(sluch) = k Next
For i = 1 To 60
SH1.Cells(i, xxx) = a(i)
Next i Next xxx
With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With
Sub Мяу() Dim col1 As New Collection, col2 As New Collection, i&, ar(1 To 20, 1 To 2) On Error Resume Next Randomize Do While col1.Count <= 20 i = Int((30 - 1 + 1) * Rnd() + 1) col1.Add i, CStr(i) DoEvents Loop Do While col2.Count <= 20 i = Int((60 - 31 + 1) * Rnd() + 31) col2.Add i, CStr(i) DoEvents Loop For i = 1 To 20 ar(i, 1) = col1(i) ar(i, 2) = col2(i) Next Range("A1").Resize(20, 2) = ar End Sub
[/vba]
[vba]
Код
Sub Мяу() Dim col1 As New Collection, col2 As New Collection, i&, ar(1 To 20, 1 To 2) On Error Resume Next Randomize Do While col1.Count <= 20 i = Int((30 - 1 + 1) * Rnd() + 1) col1.Add i, CStr(i) DoEvents Loop Do While col2.Count <= 20 i = Int((60 - 31 + 1) * Rnd() + 31) col2.Add i, CStr(i) DoEvents Loop For i = 1 To 20 ar(i, 1) = col1(i) ar(i, 2) = col2(i) Next Range("A1").Resize(20, 2) = ar End Sub
Вобщем по совету Лены поковырялся, получил желаемый результат. Получилось сумбурно. громоздко и запутанно... но главное результат есть. [vba]
Код
Sub RandomData2()
Dim a(1 To 30) As Byte, a2(1 To 30) As Byte, a3(1 To 60) As Byte, k As Byte, i As Byte, sluch As Byte, xxx As Byte
With Application .Calculation = xlCalculationManual .ScreenUpdating = False End With Randomize For xxx = 2 To 5
For i = 1 To 30 If i > 0 Then a(i) = i Next For i = 1 To 30 If i > 0 Then a2(i) = i Next For i = 1 To 30 sluch = Int(Rnd() * 30 + 1) k = a(i): a(i) = a(sluch): a(sluch) = k Next
For i = 1 To 30 sluch = Int(Rnd() * 30 + 1) k = a2(i): a2(i) = a2(sluch): a2(sluch) = k Next
For i = 1 To 30 If a(i) > 10 Then a(i) = 0 If a2(i) < 11 Or a2(i) > 20 Then a2(i) = 0 Next
For i = 1 To 60 If i <= 30 Then a3(i) = a(i) If i > 30 Then a3(i) = a2(i - 30) Next
For i = 1 To 60 If a3(i) > 0 Then sluch = Int(Rnd() * 20 + 1)
For ttt = 1 To 60 If a3(ttt) = sluch Then k = a3(i): a3(i) = sluch: a3(ttt) = k Exit For End If Next ttt End If Next
For i = 1 To 60
SH1.Cells(i, xxx) = a3(i)
Next i Next xxx
With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With
End Sub
[/vba]
RAN, ваш предложенный код я пока не осилил. да и не выдает он нужного результата - часть нужных чисел порядка просто не выдает. появится время, попытаюсь докрутить до своей задачи. Спасибо. у вас взял применение Randomize, не знал.
Вобщем по совету Лены поковырялся, получил желаемый результат. Получилось сумбурно. громоздко и запутанно... но главное результат есть. [vba]
Код
Sub RandomData2()
Dim a(1 To 30) As Byte, a2(1 To 30) As Byte, a3(1 To 60) As Byte, k As Byte, i As Byte, sluch As Byte, xxx As Byte
With Application .Calculation = xlCalculationManual .ScreenUpdating = False End With Randomize For xxx = 2 To 5
For i = 1 To 30 If i > 0 Then a(i) = i Next For i = 1 To 30 If i > 0 Then a2(i) = i Next For i = 1 To 30 sluch = Int(Rnd() * 30 + 1) k = a(i): a(i) = a(sluch): a(sluch) = k Next
For i = 1 To 30 sluch = Int(Rnd() * 30 + 1) k = a2(i): a2(i) = a2(sluch): a2(sluch) = k Next
For i = 1 To 30 If a(i) > 10 Then a(i) = 0 If a2(i) < 11 Or a2(i) > 20 Then a2(i) = 0 Next
For i = 1 To 60 If i <= 30 Then a3(i) = a(i) If i > 30 Then a3(i) = a2(i - 30) Next
For i = 1 To 60 If a3(i) > 0 Then sluch = Int(Rnd() * 20 + 1)
For ttt = 1 To 60 If a3(ttt) = sluch Then k = a3(i): a3(i) = sluch: a3(ttt) = k Exit For End If Next ttt End If Next
For i = 1 To 60
SH1.Cells(i, xxx) = a3(i)
Next i Next xxx
With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With
End Sub
[/vba]
RAN, ваш предложенный код я пока не осилил. да и не выдает он нужного результата - часть нужных чисел порядка просто не выдает. появится время, попытаюсь докрутить до своей задачи. Спасибо. у вас взял применение Randomize, не знал.Sancho