Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Генерация случайной последовательности чисел на два блока - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Генерация случайной последовательности чисел на два блока (Макросы/Sub)
Генерация случайной последовательности чисел на два блока
Sancho Дата: Четверг, 01.04.2021, 08:49 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 264
Репутация: 18 ±
Замечаний: 0% ±

2007, 2010, 2013
Всем доброго дня!
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]
К сообщению приложен файл: 9696475.xlsm(19.3 Kb)
 
Ответить
СообщениеВсем доброго дня!
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]

Автор - Sancho
Дата добавления - 01.04.2021 в 08:49
Pelena Дата: Четверг, 01.04.2021, 09:27 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 17873
Репутация: 4019 ±
Замечаний: ±

Excel 2016 & Mac Excel
Здравствуйте.
А если взять именно по десять из первого и второго блока и потом дополнительно перемешать?


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеЗдравствуйте.
А если взять именно по десять из первого и второго блока и потом дополнительно перемешать?

Автор - Pelena
Дата добавления - 01.04.2021 в 09:27
Sancho Дата: Четверг, 01.04.2021, 10:29 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 264
Репутация: 18 ±
Замечаний: 0% ±

2007, 2010, 2013
Pelena, Спасибо за идею, надо подумать как это реализовать.
 
Ответить
СообщениеPelena, Спасибо за идею, надо подумать как это реализовать.

Автор - Sancho
Дата добавления - 01.04.2021 в 10:29
RAN Дата: Четверг, 01.04.2021, 11:21 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 5494
Репутация: 1100 ±
Замечаний: 0% ±

2010
[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]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[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]

Автор - RAN
Дата добавления - 01.04.2021 в 11:21
Sancho Дата: Четверг, 01.04.2021, 18:26 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 264
Репутация: 18 ±
Замечаний: 0% ±

2007, 2010, 2013
Вобщем по совету Лены поковырялся, получил желаемый результат. Получилось сумбурно. громоздко и запутанно... но главное результат есть.
[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, не знал.
К сообщению приложен файл: 4039587.xlsm(23.6 Kb)
 
Ответить
СообщениеВобщем по совету Лены поковырялся, получил желаемый результат. Получилось сумбурно. громоздко и запутанно... но главное результат есть.
[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
Дата добавления - 01.04.2021 в 18:26
RAN Дата: Четверг, 01.04.2021, 19:16 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 5494
Репутация: 1100 ±
Замечаний: 0% ±

2010
не выдает он нужного результата - часть нужных чисел порядка просто не выдает

Каких, например?

чтобы вопросы гарантированно выпадали в тест из двух блоков с соотношением 50/50

20 из 1-30 и 20 из 31-60 Что не так?


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
не выдает он нужного результата - часть нужных чисел порядка просто не выдает

Каких, например?

чтобы вопросы гарантированно выпадали в тест из двух блоков с соотношением 50/50

20 из 1-30 и 20 из 31-60 Что не так?

Автор - RAN
Дата добавления - 01.04.2021 в 19:16
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Генерация случайной последовательности чисел на два блока (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования Jobsora jooble
© 2010-2021 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!