Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
1

Случайный выбор в % соотношении.

02.11.2011, 14:47. Просмотров 1047. Ответов 14
Метки нет (Все метки)

Добрый день, есть задача.
Дано
Груша 35%
Арбуз 45%
Виноград 20%

Строки могут меняться в количестве.
То есть винограда может и не быть.

Нужно случайно выбирать из того что есть но учитывать % чем больше тем у этого продукта больше шансов что он выпадет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2011, 14:47
Ответы с готовыми решениями:

Случайный выбор из ComboBox
Случайный выбор из ComboBox при нажатии на кнопку. Почему выдает ошибку в строках: unit...

Случайный выбор в делфи
Люди, помогите пожалуйста! надо сделать так, чтобы вопросы появлялись случайным образом и не...

Случайный выбор Формы
Как правильно сделать, чтобы при нажатии на Button случайно открывалась одна из пяти форм??...

Случайный выбор-бросок кубика Delphi
Люди, нет ли у кого готовой проги с картинки

14
Эксперт по математике/физике
4141 / 2045 / 421
Регистрация: 19.07.2009
Сообщений: 3,099
Записей в блоге: 23
02.11.2011, 18:03 2
Буду полагать, что сумма тех процентов будет 100%, иначе нужно перенормировку делать. Пусть данные, например, хранятся в StringGrid:
имена -- StringGrid.Cells[0,i], i=1,2,3,...
шансы (цисло) -- StringGrid.Cells[1,i], i=1,2,3,...

Если у нас есть случайное число k от 0 до 100, то
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum^{i-1}_{j=0}p_i \; < \; k  < \sum^{i}_{j=0}p_i
имеет вероятность pk/100, где pi -- шансы (в %) выбора i-го элемента.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function Choice(StringGrid: TStringGrid): String;
var n: real; k,i: byte;
begin
randomize; { генерируем случайное число }
n:=random;
k:=trunc(random*100); { и приводим к процентам }
i:=1;
{ ищем номер i }
while StrToInt(StringGrid.Cells[1,i])<k
    do k:=k-StrToInt(StringGrid.Cells[1,i]);
{ возвращаем имя }
Choice:=StringGrid.Cells[0,i];
end;
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
02.11.2011, 20:00  [ТС] 3
Mysterious Light, и не совсем понятно зачем вам n
 Комментарий модератора 
Общение только на форуме!
Их этого поста удалены личные данные!
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
02.11.2011, 20:29 4
Mysterious Light, randomize достаточно вызвать один раз при старте программы
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
02.11.2011, 20:46  [ТС] 5
Извените, и i всегда = 1 что-то не совсем понятная функция.
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
02.11.2011, 20:50 6
BARVIT, то есть у тебя дан файл с такой структурой, что дан товар и дан процент, и на каждой строке они разделяются только пробелом?
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
02.11.2011, 21:09  [ТС] 7
deathNC,
на данный момент это в таблице поле название поле % ну эт не суть, мне принцип сам, там я уже выкручусь
Просто неохота привязываться к 100% то есть может быть и так по %
Название1 - 50%
Название2 - 30%
Название3 - 50%
Название4 - 15%

Самый идеальный вариант это так. и это в TStriglist
Название1 50
Название2 30
Название3 50
Название4 15

Название пробел цифра без знака % (но имеем ввиду что все в %)
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
02.11.2011, 21:34 8
Ну, самое простое, это подгрузить в структурированный массив:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TItem = record
    name: String;
    Value: Integer;
  end;
  TItems = Array of TItem;
...
function LoadArr(s: TStrings): TItems;
var
  i, sep1: Integer;
  
begin
  SetLength(result, s.Count);
  for i := 0 to s.Count - 1 do
    begin
      sep1 := pos(' ', s.Strings[i]);
      Result[i].Name := copy(s.Strings[i], 1, sep1 - 1);
      Result[i].Value := StrToInt(copy(s.Strings[i], sep1 + 1, Length(s.Strings[i]) - sep1));
    end;
end;
Ну а теперь рандомно взять число от 1 до 100 и смотреть - в какой интервал попало, тот элемент и брать...
Если не разберёшься как это сделать - пиши сюда...
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
02.11.2011, 23:38  [ТС] 9
deathNC,
Ничего не понял, что формируется? тот же набор данных что и на входе? Можно с комментариями, А лучше так (но тоже с комментариями) функция на входе получает StringList и отдает номер строки что выпало.
И почему от 1 до 100 ?

Добавлено через 30 минут
deathNC,
На сколько я понял ты хочешь сформировать столько записей сколько стоит цифра на против продукта, и так по каждому продукту, но ведь у тебя всегда получается 3 записи. и рандом до 100 будет выходить за их количество. или я не правильно понял?
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
03.11.2011, 09:24 10
вот наклепал по быстому, сильно ногами не пинайте
0
Вложения
Тип файла: zip 1.zip (7.2 Кб, 13 просмотров)
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
03.11.2011, 10:52  [ТС] 11
SYSM,
0 дает больше чем значение. это так задумано?
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
03.11.2011, 11:08 12
это когда ни один не выпал, рандом же из 4 фруктов может не один не выбрать, так что эту ситуацию нужно как то обходить, а как это уже твое дело, я только показал, что в процентном отношении при 1000 заходов алгоритм в пределах нормы
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 7
03.11.2011, 12:53  [ТС] 13
SYSM, Я немного по другому зделал, получаю кол-во фруктов, беру их % и составляю список допустим Яблоко 40 значит добавляю 40 яблок, и так с остальными, только рандом потом беру из общего количества что у меня вышло. так не впадает 0, и на 1000 проходов отлично работает, даже на 500 почти идеально, а вот если брать меньше ..... то уже не то.
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
03.11.2011, 13:01 14
ну а что ты хотел, так всегда, возьми монету 50\50 шанс, и посмотришь, что будет твориться, чем больше бросков тем правильнее будет утверждение, что шанс 50\50, так что даже в лотерею можно выиграть 10 раз подряд, или всю жизнь ничего не выиграть

а если брать по моему алгоритму, то его нужно в рекурсию превращать, тогда норм будет
0
5434 / 2139 / 450
Регистрация: 20.11.2009
Сообщений: 7,156
Записей в блоге: 1
03.11.2011, 16:07 15
http://ru.wikipedia.org/wiki/%... 0%B8%D0%B5

вот думаю будет полезно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2011, 16:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как реализовать случайный выбор числа?
Добрый день, у меня проблемка такая. Допустим есть 5 чисел 10000, 15000, 17000, 20000. Как...

Случайный выбор из строки слова из 5 букв
Пишу игру &quot;Балда&quot;. Возник вопрос: как прописать код так, чтобы игра могла выбирать рэндамно слово...

Случайный выбор цифр, указанных через запятую
Нужно из лейбла выбрать одно число случайно,, которые записаны через запятую. Ну можно еще из...

Подскажите, как сделать случайный выбор и случайный выбор ответов?
подскажите как сделать случайный выбор вопросов и случайны выбор ответов var questions = , ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.