Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
16.04.2024, 19:31:03

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 240 Сообщений в 5 456 Тем от 6 756 Пользователей
Последний пользователь: Expert2024
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Генерация случайных чисел без повторов
Страниц: [1]   Вниз
Печать
Автор Тема: Генерация случайных чисел без повторов  (Прочитано 25011 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Elena666
Пользователь
**

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 87


Просмотр профиля
« : 31.07.2015, 14:36:08 »

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

Пытаюсь переделать макрос для генерации случайных чисел с 1 по 35. Использую за основу вот это:
Код: (vb)
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
Глобальный модератор
Ветеран
*****

Репутация: +67/-0
Офлайн Офлайн

Сообщений: 634


Просмотр профиля E-mail
« Ответ #1 : 31.07.2015, 15:06:57 »

Так пойдет
Код: (vb)
Sub random()
 r = WorksheetFunction.RandBetween(1, 35)
End Sub
Записан
Alex_Gur
Старожил
****

Репутация: +11/-0
Офлайн Офлайн

Сообщений: 278


Просмотр профиля
« Ответ #2 : 31.07.2015, 16:40:29 »

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

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

Репутация: +11/-0
Офлайн Офлайн

Сообщений: 278


Просмотр профиля
« Ответ #3 : 31.07.2015, 21:58:53 »

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

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

и т.д. до тех пор, пока не останется один элемент.
Все!

Записан

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

Репутация: +3/-0
Офлайн Офлайн

Сообщений: 84


Просмотр профиля
« Ответ #4 : 31.07.2015, 22:01:53 »

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


Код: (vb)
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
Эксперты
Новичок
*

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 19


Просмотр профиля
« Ответ #5 : 31.07.2015, 22:59:23 »

Код: (vb)
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
Пользователь
**

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 87


Просмотр профиля
« Ответ #6 : 01.08.2015, 09:48:01 »

Спасибо всем огромное. Сначала пытаюсь преобразовать свой. Для примера, делаю случайные целые числа от 1 до 5. все бы ничего , но иногда оставляет ячейку пустой. Подскажите, пожалуйста, как исправить.
Код: (vb)
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
Пользователь
**

Репутация: +3/-0
Офлайн Офлайн

Сообщений: 84


Просмотр профиля
« Ответ #7 : 01.08.2015, 16:11:58 »

 
Elena666,попробуйте заменить  вашу строку 7 на:
 
 
Код: (vb)
sluch = Int(Rnd() * (5) + 1)
Записан
Elena666
Пользователь
**

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 87


Просмотр профиля
« Ответ #8 : 02.08.2015, 14:04:06 »

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

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 5


Просмотр профиля E-mail
« Ответ #9 : 04.12.2016, 17:16:25 »

Function RndUnicArr(n&, Optional m& = 0)
Здравствуйте, Михаил. Очень плохо разбираюсь в макросах... Подскажите, как корректно эту функцию создать в Гуглтаблицах? Выдает очень много ошибок гугл (пробовал просто скопировать и вставить в редактор скриптов. Там это видимо так называется)
« Последнее редактирование: 04.12.2016, 18:58:18 от vikttur » Записан
Chertyozhnik
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 5


Просмотр профиля E-mail
« Ответ #10 : 04.12.2016, 17:28:49 »

Может кто-то может подсказать, как этот скрипт внедрить в Гугл? Проблема в знаках препинания...
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #11 : 04.12.2016, 17:39:21 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Chertyozhnik
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 5


Просмотр профиля E-mail
« Ответ #12 : 04.12.2016, 17:48:37 »

Этот никак не внедрить, т.к. в Google-таблицах совершенно другой язык программирования.
А возможно это же создать в гугле? Есть умельцы? )) Сказав, что я в этом плохо разбираюсь, я имел ввиду, что я вообще это вижу в первый раз...
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #13 : 04.12.2016, 18:04:01 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Chertyozhnik
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 5


Просмотр профиля E-mail
« Ответ #14 : 04.12.2016, 20:05:20 »

Спасибо. Попробую
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru