|
v8: Генератор случайных чисел | ☑ | ||
---|---|---|---|---|
0
Алтунтоп
20.03.12
✎
11:52
|
ТаблицаКарт=Новый ТаблицаЗначений;
ТаблицаКарт.Колонки.Добавить("Карта"); Выборка=Справочники.Карты.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока=ТаблицаКарт.Добавить(); НоваяСтрока.Карта=Выборка.Ссылка; КонецЦикла; Для Каждого Стр Из ТаблицаКарт Цикл ГСЧ = Новый ГенераторСлучайныхЧисел(ТаблицаКарт.Количество()-1); СлучайноеЧисло = ГСЧ.СлучайноеЧисло(, ТаблицаКарт.Количество()-1); Сообщить(СлучайноеЧисло); Если ТаблицаКарт.Количество()=1 Тогда ТаблицаКарт.Очистить(); Иначе ТаблицаКарт.Удалить(СлучайноеЧисло); КонецЕсли; КонецЦикла; Этот выдает только 18 чисел и все а надо чтобы выдавал 36. Как исправить??? |
|||
1
le_
20.03.12
✎
11:55
|
(0) Неверный подход - удалять строки в цикле Для Каждого Из.
|
|||
2
Wobland
20.03.12
✎
11:57
|
>Этот выдает только 18 чисел и все а надо чтобы выдавал 36.
как представитель известного капитана скажу: ГСЧ.СлучайноеЧисло(0, 36); |
|||
3
Wobland
20.03.12
✎
11:57
|
(2) тфу, плин, 0-35
|
|||
4
Wobland
20.03.12
✎
11:58
|
ну и эта... ТаблицаКарт.Количество() что говорит?
|
|||
5
Алтунтоп
20.03.12
✎
12:01
|
Этот модуль будет использоваться для раздачи карт в случайном порядке поэтому возникла необходимость удалить строку по случайному числу, т.к. эта карта только один раз присутствует в таблице значений
|
|||
6
zak555
20.03.12
✎
12:03
|
(5) чё ?
|
|||
7
salvator
20.03.12
✎
12:04
|
СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0,ТаблицаКарт.Количество()-1);
Где ТаблицаКарт.Количество() = 36, надеюсь |
|||
8
Wobland
20.03.12
✎
12:05
|
(5) >для раздачи карт в случайном порядке
заводил я себе ветку для взятия случайного элемента справочника... имхо самое простое - генерить случайное число (элемент) до тех пор, пока он не окажется в невыданных |
|||
9
Omskdizel
20.03.12
✎
12:05
|
Ты не удаляй строки из таблицы, а помечай, что она была использована. Через НайтиСтроки() находишь те, что не были использованы, по этому же массиву определишь сколько их осталось и какие границы генератора задать.
|
|||
10
Wobland
20.03.12
✎
12:06
|
(0) хошь, покер дам? если найду
|
|||
11
Алтунтоп
20.03.12
✎
12:06
|
Спасибо попробую!
|
|||
12
Алтунтоп
20.03.12
✎
12:06
|
Нет, мне преферанс нужен по сети
|
|||
13
Tatitutu
20.03.12
✎
12:06
|
совершенно не правильный подход у тебя
а если СлучайнойЧисло у тебя несколько раз одинаковое будет? |
|||
14
zak555
20.03.12
✎
12:07
|
(8) +1
но выданные числа лучше хранить в хранилище |
|||
15
Wobland
20.03.12
✎
12:07
|
+(10) ещё морской бой в бардачке валяться должен ;)
|
|||
16
Omskdizel
20.03.12
✎
12:07
|
(13) По схеме из (9) проблема даже не возникнет. Проверял :)
|
|||
17
Wobland
20.03.12
✎
12:08
|
кстати, коллеги! подскажите алгоритм генерации СЧ в заданном диапазоне без повторов. знаю, что придумано
|
|||
18
Wobland
20.03.12
✎
12:09
|
(12) увидишь, как делался алгоритм раздачи/тасования
|
|||
19
Omskdizel
20.03.12
✎
12:09
|
(17) В (9) все уже решено :))
Делаешь ТЗ со списком твоего диапазона и далее как в (9)... |
|||
20
Wobland
20.03.12
✎
12:11
|
(19) нене, у меня академический вопрос. лучше (9) на 1С не придумаешь, пожалуй, но в самом общем случае как? вроде формула была
|
|||
21
Omskdizel
20.03.12
✎
12:13
|
Останется только один вопрос, насколько равномерно распределение алгоритма, который в 1С сидит.
|
|||
22
Wobland
20.03.12
✎
12:15
|
(21) есть у меня преферанс, у которого в настройках задаётся распределение тасования ;)
|
|||
23
Omskdizel
20.03.12
✎
12:15
|
(20) Я чет даже подход особо придумать иной не могу. Боюсь, что иной алгоритм будет иметь плохое распределение, у стандартного алгоритма распределение такое же, как и у ГСЧ, который он использует.
|
|||
24
kosts
20.03.12
✎
12:16
|
Сортируем в случайном порядке 100 раз, карты уже будут в случайным порядке, останется взять сколько нужно.
Завести ТЗ с картами Карта|НомерДляСортировки
|
|||
25
Omskdizel
20.03.12
✎
12:17
|
(22) Я общался с ребятами, которые рассказывали как такое делается в нардах на деньги :) Т.е. если надо, чтобы определенный игрок выиграл, он выиграет с очень большой вероятностью :)
|
|||
26
Lama12
20.03.12
✎
12:17
|
(0)Алгоритм раздачи карт есть в книжке "128 советов начинающему программисту".
Не помню сути алгоритма из книжке, но сам сделал бы так. Делаю массив карт в колоде. Далее ГСЧ выбираю порядковый номер из массива. Максимум 35 проходов будет. Отчасти похоже на алгоритм монтекарло. |
|||
27
Omskdizel
20.03.12
✎
12:17
|
(24) А если случайные числа повторятся?
|
|||
28
Cube
20.03.12
✎
12:17
|
ТаблицаКарт=Новый ТаблицаЗначений;
ТаблицаКарт.Колонки.Добавить("НомерДляСортировки"); ТаблицаКарт.Колонки.Добавить("Карта"); Выборка=Справочники.Карты.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока=ТаблицаКарт.Добавить(); НоваяСтрока.Карта=Выборка.Ссылка; КонецЦикла; ГСЧ = Новый ГенераторСлучайныхЧисел(); Для Каждого Стр Из ТаблицаКарт Цикл Стр.НомерДляСортировки = ГСЧ.СлучайноеЧисло(); КонецЦикла; ТаблицаКарт.Сортировать("НомерДляСортировки"); В итоге имеем список карт, отсортированный в случйном порядке. |
|||
29
Wobland
20.03.12
✎
12:18
|
(23) подозреваю, что человек по имени Кнут это описал. дык нету книг
|
|||
30
Lama12
20.03.12
✎
12:18
|
(26) +
Естественно, после выпадения карты, из массива удаляется ее элемент и размерность массива уменьшается. в ГСЧ передается размерность массива. |
|||
31
Cube
20.03.12
✎
12:18
|
(24) Опередил :)
|
|||
32
Omskdizel
20.03.12
✎
12:18
|
(29) Знатный был человек, жаль уже не с нами
|
|||
33
Omskdizel
20.03.12
✎
12:19
|
(28) Смотри (24)
|
|||
34
Wobland
20.03.12
✎
12:19
|
(28) сортировать с удалением (выдачей карты) - ну уж куда проще ;)
|
|||
35
Omskdizel
20.03.12
✎
12:19
|
Ой, не, смотри (27)
|
|||
36
Wobland
20.03.12
✎
12:20
|
(32) ну дык, он же записал. значит, не совсем не с нами ;)
|
|||
37
Omskdizel
20.03.12
✎
12:21
|
(36) Ну да, ты прав. Он столько сделал, что вряд ли когда нас покинет :)
|
|||
38
Vladal
20.03.12
✎
12:25
|
(0) Раскладку колоды карт пишешь?
Приходит БОМЖ в милицию с заявой, что у него украли 37 предметов: ключ для открывания пивных бутылок и колоду карт. |
|||
39
Omskdizel
20.03.12
✎
12:26
|
(12) Кстати, дружищще, это дело то подсудное нынче в России, ты аккуратнее там, чтоб не подсесть :)
|
|||
40
Vladal
20.03.12
✎
12:26
|
(12) На инфостарт выложишь, скинь, потом, пожалуйста, бесплатно и мне ;0
|
|||
41
Altuntop
20.03.12
✎
13:10
|
Спасибо, самый оптимальный вариант!(24)и (28). По (9) тормозит и долго формирует.
|
|||
42
Cube
20.03.12
✎
13:12
|
(41) Ну уж нет)) Вот самый оптимальный вариант:
ТаблицаКарт=Новый ТаблицаЗначений; ТаблицаКарт.Колонки.Добавить("НомерДляСортировки"); ТаблицаКарт.Колонки.Добавить("Карта"); ГСЧ = Новый ГенераторСлучайныхЧисел(); Выборка=Справочники.Карты.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = ТаблицаКарт.Добавить(); НоваяСтрока.Карта = Выборка.Ссылка; НоваяСтрока.НомерДляСортировки = ГСЧ.СлучайноеЧисло(); КонецЦикла; ТаблицаКарт.Сортировать("НомерДляСортировки"); |
|||
43
Omskdizel
20.03.12
✎
14:31
|
(41) При стандартной колоде в алгоритме из (9) вылезли тормоза??? Уважаемый, сдается мне вы что-то там оооочень криво реализовали. Киньте код в тему, хоть посмеяться.
|
|||
44
Omskdizel
20.03.12
✎
14:34
|
(42) С точки зрения математики метод не очень чист, ибо на обычное распределение случайных чисел накладывается вероятность того, что у двух карт будет одинаковое число и одна из них фактически не будет сортироваться. Да, вероятность очень мала, но она есть.
|
|||
45
Wern
20.03.12
✎
14:38
|
Если достаточно большой диапазон случайных чисел, шанс что будет два одинаковых не большой, это же не от 1 до 10 выбирать.
|
|||
46
Omskdizel
20.03.12
✎
14:46
|
(45) Приятно, когда цитируют, чувствую себя начинающим классиком :)
|
|||
47
Mort
20.03.12
✎
15:54
|
Совсем недавно то же самое сделал, тока на 52 карты.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |