Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Генерация случайных чисел без повторов

Автор Elena666, 31.07.2015, 14:36:08

« назад - далее »

Elena666

Здравствуйте, форумчане.
Проблема в следующем:

Пытаюсь переделать макрос для генерации случайных чисел с 1 по 35. Использую за основу вот это:
Option Explicit
Sub random()
Dim a(156), k, i, sluch As Integer
For i = -78 To 78
    If i <> 22 Then a(i + 78) = i
Next
For i = 0 To 156
    sluch = Int(Rnd() * (156))
    k = a(i): a(i) = a(sluch): a(sluch) = k
Next
'выводим готовый массив
For i = -78 To 78
    Cells(i + 79, 1) = a(i + 78)
Next
End Sub
.
Но ничего не выходит, подскажите, пожалуйста, что нужно исправить. Спасибо.

doober

Так пойдетSub random()
r = WorksheetFunction.RandBetween(1, 35)
End Sub

Alex_Gur

Цитироватьбез повторов
Елена, а что значит "без повторов"?
Если случайные числа - действительные (не целые), то повторов, с большой долей вероятности, не будет.
Если же случайные числа - целые, то вероятность повторов значительно повышается, а после генерации 36-го числа повтор будет с вероятностью 100%.
Для Вас принципиально важно, чтобы из 35 чисел не было ни одного повтора?
Мы заинтересованы не только решить ваши задачи, но и помочь вам научиться решать их самостоятельно.
"Дай человеку рыбу, и он будет сыт весь день. Научи человека ловить рыбу, и он будет сыт всю жизнь" :)

Alex_Gur

На всякий случай, хотел бы предложить несложный алгоритм случайного подбора чисел 1-35 без повторов.
В начале числа 1-35 можно разместить подряд в массив из 35 элементов.
Запускаем процедуру
r = WorksheetFunction.RandBetween(1, 35)
Допустим, выпадет число 12.
12-й элемент массива помещаем в конец массива, а элементы 13-35 сдвигаем на 1.
Далее снова запускаем процедуру, но уже для 34 первых элементов:
r = WorksheetFunction.RandBetween(1, 34)
и т.д. до тех пор, пока не останется один элемент.
Все!

Мы заинтересованы не только решить ваши задачи, но и помочь вам научиться решать их самостоятельно.
"Дай человеку рыбу, и он будет сыт весь день. Научи человека ловить рыбу, и он будет сыт всю жизнь" :)

sv2015

Elena666,для генерации неповторяющихся случайных чисел (от 1 до 35 )подойдут два макроса,-запускать сначала первый макрос,затем второй(неповторяющиеся случайные числа генерируются  в столбце B,вторым макросом).
Идея вам ,я думаю, будет понятна,чтобы подстроить под свой случай.
 
  Sub use1()
Dim i&
For i = 1 To 35
Cells(i, 1) = Rnd
Cells(i, 2) = i
Next i
End Sub


Sub use2()
Dim i&, j&
For i = 1 To 35
      For j = i + 1 To 35
         If Cells(i, 1) > Cells(j, 1) Then
             x1 = Cells(j, 1): x2 = Cells(j, 2)
            Cells(j, 1) = Cells(i, 1): Cells(j, 2) = Cells(i, 2)
            Cells(i, 1) = x1: Cells(i, 2) = x2
        End If
      Next j
Next i
End Sub

MCH

Function RndUnicArr(n&, Optional m& = 0)
'функция генерации случайных уникальных целых чисел от 1 до n
'возвращает горизонтальный массив из m элементов
    Dim i&, j&, a&()
    If n < 1 Or n > 10000000 Then Exit Function
    If m > n Or m < 1 Then m = n
    ReDim a&(1 To n)
    Randomize
    For i = 1 To n
        j = Int(Rnd * i + 1)
        If i <> j Then a(i) = a(j)
        a(j) = i
    Next i
    ReDim Preserve a&(1 To m)
    RndUnicArr = a
End Function

Elena666

Спасибо всем огромное. Сначала пытаюсь преобразовать свой. Для примера, делаю случайные целые числа от 1 до 5. все бы ничего , но иногда оставляет ячейку пустой. Подскажите, пожалуйста, как исправить.
Sub random()
Dim a(6), k, i, sluch As Integer
For i = 1 To 5
If i > 0 Then a(i) = i
Next
For i = 1 To 5
    sluch = Int(Rnd() * (5))
    k = a(i): a(i) = a(sluch): a(sluch) = k
Next

For i = 1 To 5
    Cells(i, 1) = a(i)
Next
End Sub

sv2015

 
Elena666,попробуйте заменить  вашу строку 7 на:

sluch = Int(Rnd() * (5) + 1)

Elena666

Супер! все отлично, работает как надо! Спасибо, огромное!

Chertyozhnik

#9
Цитата: MCH от 31.07.2015, 22:59:23
Function RndUnicArr(n&, Optional m& = 0)
Здравствуйте, Михаил. Очень плохо разбираюсь в макросах... Подскажите, как корректно эту функцию создать в Гуглтаблицах? Выдает очень много ошибок гугл (пробовал просто скопировать и вставить в редактор скриптов. Там это видимо так называется)

Chertyozhnik

Может кто-то может подсказать, как этот скрипт внедрить в Гугл? Проблема в знаках препинания...

Дмитрий Щербаков(The_Prist)

Этот никак не внедрить, т.к. в Google-таблицах совершенно другой язык программирования.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Chertyozhnik

Цитата: The_Prist от 04.12.2016, 17:39:21
Этот никак не внедрить, т.к. в Google-таблицах совершенно другой язык программирования.
А возможно это же создать в гугле? Есть умельцы? )) Сказав, что я в этом плохо разбираюсь, я имел ввиду, что я вообще это вижу в первый раз...

Дмитрий Щербаков(The_Prist)

Создайте тему в разделе Вопросы по работе в Google-таблицах , со ссылкой на эту тему. Может кто подтянется.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Chertyozhnik


Яндекс.Метрика Рейтинг@Mail.ru