Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / генерация случайного числа для каждой ячейки / 25 сообщений из 33, страница 1 из 2
19.03.2017, 12:35
    #39422428
95bugimen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
смотрите есть запрос на генерацию случайных чисел в определенное поле
Sub Macro1()
[Visual Basic]
Dim LRandomNumber As Integer
Dim s$

Randomize
LRandomNumber = Int((300 - 200 + 1) * Rnd() + 200)

s = "UPDATE вычисляемые SET [пук]=" & LRandomNumber & " WHERE [крак]>=0"

CurrentDb.Execute s
End Sub
[Visual Basic/]
но проблема в том что , это генерирует на все поле,покажите как правильно написать цикл "While not" ,чтобы он не трогал уже заполненные ячейки?
...
Рейтинг: 0 / 0
19.03.2017, 12:39
    #39422432
95bugimen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
я ,языка не знаю,это собрано по гуглу было...
...
Рейтинг: 0 / 0
19.03.2017, 13:02
    #39422446
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimen,

Вы бы изложили изначальную задачу, без своего видения, типа - как сесть на стул из которого торчит гвоздь?
А то у вас получилось что-то типа - сгибаю ноги в коленях - в пятую точку нечто колет...

куча вопросов:
- случайные числа какие и в каком диапазоне?
- должны повторяться или нет?
- ....
...
Рейтинг: 0 / 0
19.03.2017, 13:14
    #39422452
95bugimen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
vmag,там функция для случайных чисел и диапазон уже есть "Int((300 - 200 + 1) * Rnd() + 200)",нужно чтобы был запрос для каждой ячейки определенного поля создавал случайные числа,но для каждой ячейки это число должно быть свое, у меня в программе,он генерирует числа ,но для всего поля,т.е. чтобы в поле все числа были разные . [img=поле.png]
...
Рейтинг: 0 / 0
19.03.2017, 13:14
    #39422453
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
диапазон понятен из формулы - от 200 до 300.
Код: vbnet
1.
Int((300 - 200 + 1) * Rnd() + 200)
...
Рейтинг: 0 / 0
19.03.2017, 13:16
    #39422456
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimen,

а объяснять без картинок, словами, плохо получается?)))
...
Рейтинг: 0 / 0
19.03.2017, 13:25
    #39422460
95bugimen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
хм-м-м,
ну вон человек не понял,попросил разьяснить
...
Рейтинг: 0 / 0
19.03.2017, 14:00
    #39422468
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimen,

Ну, как я понял (совместными усилиями):
- диапазон от 200 до 300 (мне просто показалось, что это пример из гугла без изменений)
- соответственно всего будет максимум записей в таблице 101 (если 200 и 300 входят в диапазон, повторений не должно быть и на выходе рандомизатора целые числа 200, 201, 202, ... 300)
- таблица на максимум 101 запись уже заполнена, нужно только прописать поля рандомизатором.
ИМХО задачу можно с вести к алгоритму перемешивания колоды карт:
1. Делаем массив (m) integer, грубо от 200 до 300, обнуляем.
2. Цикл по записям.
3. Вычисляем случайное число от 200 до 300 - (i)
- если в массиве m (i) стоит ноль, пишем в m (i) единицу, а в запись пишем i и уходим на пункт 2, берем следующую запись.
- если в массиве m (i) уже стоит один (выбрано ранее), берем следующий элемент массива, в котором стоит ноль, если уперлись в конец массива, ищем в массиве m(i) = 0 с начала. Соответственно по очередному m(i) <> 0 пишем в m (i) единицу, а в запись пишем i и уходим на пункт 2, берем следующую запись.
Итого в конце все m(i) = 1, а записи заполнены без повторений рандомизатора.

Мдя... чтобы ответить - тз, придется придумывать самому... не так придумал, не так ответил, соответственно...
...
Рейтинг: 0 / 0
19.03.2017, 14:06
    #39422472
95bugimen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
vmag,ахха а до меня долшо,все куда проще [пук] is null
...
Рейтинг: 0 / 0
19.03.2017, 14:14
    #39422478
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimenvmag,ахха а до меня долшо,все куда проще [пук] is null
ага... первое число будет например 210
все пуки null, всем пропишется один раз 210 и пуков с null имхо больше не будет...
...
Рейтинг: 0 / 0
19.03.2017, 14:18
    #39422479
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimenvmag,ахха а до меня долшо,все куда проще [пук] is nullсомневаюсь я, однако.)))
и в том, что дошло.
и в том, что это правильное решение.
...
Рейтинг: 0 / 0
19.03.2017, 14:18
    #39422480
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimen,

тут слабое место - отсутствие повторений рандомизатора, а это значит, что каждый раз нужно проверять выпадало ранее число или нет...
...
Рейтинг: 0 / 0
19.03.2017, 16:01
    #39422526
ИВП.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
А что, если каким-либо образом заполнить случайными числами (неважно из какого диапазона) вспомогательное поле, затем отсортировать по этому полю, затем пронумеровать записи по порядку от 200 до 300?
...
Рейтинг: 0 / 0
19.03.2017, 16:29
    #39422533
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
ИВП.,

тоже вариант, только задача на счет отсутствия повторов случайных чисел не снимается, а так - вполне, и диапазон здесь как раз архи важен, например вероятность повтора выпадения одинаковых чисел из диапазона 0 - 1 000 000 000 000, теоретически меньше чем из диапазона 200 - 300. а проверку на дубли можно один раз сделать в конце и если повторения есть - повторить тупо заполнение с самого начала
...
Рейтинг: 0 / 0
19.03.2017, 16:49
    #39422537
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
ИВП.А что, если каким-либо образом заполнить случайными числами (неважно из какого диапазона) вспомогательное поле, затем отсортировать по этому полю, затем пронумеровать записи по порядку от 200 до 300?

не..... все супер, никаких проверок не нужно, и даже если повторы будут - не страшно, нумерация всё зашлифует как нужно... молодца!
...
Рейтинг: 0 / 0
19.03.2017, 17:43
    #39422580
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
ИВП.А что, если каким-либо образом заполнить случайными числами (неважно из какого диапазона) вспомогательное поле,
затем отсортировать по этому полю, затем пронумеровать записи по порядку от 200 до 300?Но с таким же успехом можно было сразу просто пронумеровать.
Или нет?
Можете объяснить разницу?
Я, честно, смысла не особо вижу.
...
Рейтинг: 0 / 0
19.03.2017, 17:51
    #39422587
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
хм-м-мМожете объяснить разницу?

одно дело просто перенумеровать...
другое дело перемешать, потом пронумеровать...

Например есть 36 шаров (от 1 до 36)
Нужно написать эмулятор игры 5 из 36 на 10 тиражей при котором 10 раз будут выбираться 5 случайных чисел...

Самый простой вариант - перемешать и взять первые пять по списку...
Если не перемешивать, то 10 раз будут шары 1, 2, 3, 4, 5...

В общем, если операция одноразовая - то как не парадоксально - ваш вариант - тупо пронумеровать самый оптимальный.
Но если многоразовая, то не покатит...
...
Рейтинг: 0 / 0
19.03.2017, 18:02
    #39422595
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
vmagхм-м-мМожете объяснить разницу?

одно дело просто перенумеровать...
другое дело перемешать, потом пронумеровать...Да это-то мне с самого начала ясно.
Дает ли это перемешивание какую-либо пользу в свете задачи ТС?
vmagкак не парадоксально - ваш вариант - тупо пронумеровать самый оптимальныйВ некотором смысле да.
...
Рейтинг: 0 / 0
19.03.2017, 18:06
    #39422598
хм-м-м
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
хм-м-мВ некотором смысле да.Сейчас попробую придумать получше,
строго по условию задачи.
...
Рейтинг: 0 / 0
19.03.2017, 18:33
    #39422612
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
Вот, готово, только имена таблицы и полей другие:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub Macro1()
 Dim S As String, _
     B(200 To 300) As Boolean
 Dim LRandomNumber As Integer
 Randomize
 Do While DCount("*", "Tabl", "zz Is Null") > 0
  Do While True
   LRandomNumber = Int((300 - 200 + 1) * Rnd() + 200)
   If Not B(LRandomNumber) Then
    B(LRandomNumber) = True
    CurrentDb.Execute ("UPDATE Tabl SET zz=" & LRandomNumber & _
                       " WHERE id=(SELECT TOP 1 id FROM Tabl WHERE zz Is Null)")
    Exit Do
   End If
  Loop
 Loop
End Sub
...
Рейтинг: 0 / 0
19.03.2017, 19:41
    #39422641
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
__MichelleВот, готово

Супер, будет работать - однозначно!
Самое интересное, что давным давно именно этот алгоритм мне и пришлось усовершенствовать... даже премию дали...

Если элементов для перемешки много, то выборка элементов идет не линейно по времени и оно заметно не постоянно, первые выбираются мгновенно, а ближе к концу рандомизатор всё чаще начинает долбиться в B(LRandomNumber) = False, которые уже выбраны, и когда например осталось выбрать последние из 1000 (типа 131, 7, 967), а в эти лунки снаряд ну никак не хочет попадать - создается ощущение, что задача вообще зависла...
Перемешка может идти и минуту и пять и десять, все зависит от количества элементов и быстродействия эвм.

Суть рац предложения как раз и была в том, что для выбора одного случайного элемента рандомизатор используется только один раз (если выборка в этом месте случилась ранее, то берется первое не выбранное место правее, а при достижении конца выборки, продолжаем искать не выбранный левее от места попадания)

Но ваш вариант точно рабочий, причем все задержки можно выдать не посвященным за качественное перемешивание
покатит...
...
Рейтинг: 0 / 0
19.03.2017, 20:26
    #39422664
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
vmagПеремешка может идти и минуту и пять и десять, все зависит от количества элементов и быстродействия эвм.Проверила.
На 1000 записей, во всех записях поле для заполнения пустое.
Получилось 3,53125 сек .
Характеристики компьютера (далеко не супер):
Процессор x86 Family 6 Model 15 Stepping 13 GenuineIntel ~1799 МГцВсего виртуальной памяти 2.00 ГБДоступно виртуальной памяти 1.96 ГБФайл подкачки 3.81 ГБ
...
Рейтинг: 0 / 0
19.03.2017, 20:47
    #39422675
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
__Michelleво всех записях поле для заполнения пустое

да - в вашем алгоритме это важно, иначе
при таком условии
Код: vbnet
1.
Do While DCount("*", "Tabl", "zz Is Null") > 0


перемешки вообще не будет...
Меня интересует другое:
поставьте после строки
Код: vbnet
1.
LRandomNumber = Int((300 - 200 + 1) * Rnd() + 200)


счетчик (думаю лонга хватит) и скажите (если не трудно) его значение в конце заполнения - это количество включения рандомизатора для перемешки 1000 элементов, если мне не изменяет память до для перемешки 10-20 элементов рандомизатор используется около сотни раз...
...
Рейтинг: 0 / 0
19.03.2017, 20:52
    #39422679
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
vmag,

Хорошо. Сделаю.
Но немного позже.
Сейчас меня к компьютеру не пускают.)))
...
Рейтинг: 0 / 0
19.03.2017, 23:02
    #39422711
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
генерация случайного числа для каждой ячейки
95bugimen,
Как я понял , задача стоит в случайной выборке нескольких несовпадающих значений из множества? Есть готовые алгоритмы . Вот один их них http://www.planetaexcel.ru/techniques/2/94/ (способ 3) . Можно адаптировать его к вашей задаче.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / генерация случайного числа для каждой ячейки / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]