Имя: Пароль:
1C
1С v8
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 раз, карты уже будут в случайным порядке, останется взять сколько нужно.
Завести ТЗ с картами
Карта|НомерДляСортировки

Для ц = 1 по 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 карты.