Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2012, 15:19   #1
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию Генератор случайно выборки из массива

Добрый день!

Суть программы следующая, есть массив, необходимо из этого массива выбрать случайным образом определенное пользователем количество данных. Например: пользователь выбирает массив состоящий из значений от 1 до N (допустим 15), потом заполняется массив этими значениями, потом пользователь выбирает сколько случайным образом значений необходимо выбрать из этого массива (допустим 5), далее генерируются 5 значений из 15 случайным образом и выводятся в столбик. Вопрос как сделать так, чтобы эти 5 случайным образом значений не повторялись? Вот код программы которую я написал, все работает ок!, только едиственная проблема не могу сделать так, чтобы значения из массива не повторялись.

Код:
Option Explicit
Option Base 1
Public Sub Упражнение_9_5()
Dim NKlienta() As Long, i As Long, Kolvo As Long, MKolvo As Long, j As Long, a As Long
Kolvo = InputBox("Ввведите общее количество клиентов", "Ввод количества клиентов")
ReDim NKlienta(Kolvo)
For i = 1 To Kolvo
    NKlienta(i) = i
Next
MKolvo = InputBox("Ввведите количество клиентов, которых необходимо случайным образом выбрать", "Ввод количества клиентов для выборки")
Randomize
    With Range("A1")
        For j = 1 To MKolvo
            a = Int(Rnd * Kolvo) + 1
            .Offset(j, 0) = a
        Next
    End With
End Sub


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.01.2012 в 15:53.
Palomnik1096 вне форума Ответить с цитированием
Старый 25.01.2012, 16:00   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

загоняйте нужные значения клиентов в массив, его перемешивайте случайныйм образом, а потом берите подряд столько значений, сколько Вам надо. т.к. изначально повторов не было, то их не будет и в перемешанном массиве.

p.s. алгоритм перемешивания смотрите на форуме...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.01.2012, 16:03   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

например так:
Код:
  ...
  Dim s As String
  Randomize: s = ""
  With Range("A1")
    For j = 1 To MKolvo
      Do: a = Int(Rnd * Kolvo) + 1: Loop Until InStr(s, "<" & a & ">") = 0
      .Offset(j, 0) = a: s = s & "<" & a & ">"
  ...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.01.2012, 08:09   #4
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Спасибо!

Если может объясните смысл
Do
a = Int(Rnd * Kolvo) + 1
Loop Until InStr(s, "<" & a & ">") = 0

Точнее интересует
InStr(s, "<" & a & ">") = 0

Заранее благодарен.
Palomnik1096 вне форума Ответить с цитированием
Старый 27.01.2012, 11:16   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я забранные номера элементов массива записываю в строку s = s & "<" & a & ">".
InStr(s, "<" & a & ">") = 0 - значит а нет в строке.
обрамляющие знаки (я взял <>) нужны для того чтобы корректно осуществить поиск. нельзя записать просто числа, потому что если потом искать "1" то единичка будет найдена в числах от 10 до 19.
а если искать "<1>" то в строке "<10>" совпадений нет.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.01.2012, 11:45   #6
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Нихрена не понял, но все равно спасибо!
Palomnik1096 вне форума Ответить с цитированием
Старый 27.01.2012, 12:03   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

))
ладно.
1. генерируем случайное число а (например, получилось 12)
2. проверяем если ли в строке s такая последовательность симолов "<12>"
3. если нет забирем 12 элемент массива и в сроку s добавляем запись "<12>", что значит 12-й уже забран.
4. выполняем п.1

строка s последовательно заполняется значениями уже выпавших номеров <> - здесь это не меньше, больше - это кавычки, которыми обрамлено число. вместо них можно использовать любые другие, даже не обязательно разные.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.01.2012, 14:18   #8
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Код:
 Randomize: s = ""
  With Range("A1")
    For j = 1 To MKolvo
      Do: a = Int(Rnd * Kolvo) + 1: Loop Until InStr(s, "<" & a & ">") = 0
      .Offset(j, 0) = a: s = s & "<" & a & ">"
А вот эту часть кода, я так понимаю можно было записать, как


[CODE]Randomize
s=""
For j = 1 To MKolvo
Do
a = Int(Rnd * Kolvo) + 1
Loop Until InStr(s, "<" & a & ">") = 0
.Offset(j, 0) = a
s = s & "<" & a & ">"
Next[CODE]

Последний раз редактировалось Palomnik1096; 27.01.2012 в 14:22.
Palomnik1096 вне форума Ответить с цитированием
Старый 27.01.2012, 14:45   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

да, похоже.
только этот алгоритм при MKolvo > 60 просто рухнет из-за переполнения длины строки s.

на коллекциях все будет работать без ограничений и очень-очень быстро.
Код:
Public Sub Упражнение_9_5()
  Dim i As Long, Kolvo As Long, MKolvo As Long, a As Long, c As New Collection
  Kolvo = InputBox("Ввведите общее количество клиентов", "Ввод количества клиентов")
  For i = 1 To Kolvo
      c.Add i
  Next
  MKolvo = InputBox("Ввведите количество клиентов, которых необходимо случайным образом выбрать", "Ввод количества клиентов для выборки")
  Randomize
  With Range("A1")
    For i = 1 To MKolvo
      a = Int(Rnd() * c.Count + 1)
      .Offset(i, 0) = c.Item(a)
      c.Remove (a)
    Next
  End With
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.01.2012, 14:53   #10
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Да вроде все работает и с предыдущим кодом, пробывал Kolvo =500, МKolvo =150, все работает, ничего не рушится
Palomnik1096 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как востановить случайно удалённый обьект в с++ билдере sigmanen C++ Builder 1 06.12.2010 20:39
случайно удалил программу voldemen Компьютерное железо 8 29.09.2010 15:32
Генератор случайных чисел для массива! Tetramorf Общие вопросы C/C++ 8 11.03.2010 13:51
случайно число (rand) Abuhamed PHP 4 20.02.2010 13:05
Случайно но не повторяясь! uraura Общие вопросы Delphi 8 30.11.2008 19:46