Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процентная вероятность и Random 
V
    Опции темы
MadCoder
  Дата 14.6.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Здравствуйте!

Подскажите, как мне выбрать случайное значение с указанной долей вероятности. Мозг в выходные вообще отказывается работать smile.

Например, у меня есть список:

Черное - 40 %
Белое - 40 %
Красное - 20 %

Итого в сумме: 100 %. Как мне запрограммировать случайное значение, учитывая % вероятность.

Я пишу:
Код

var
A: Integer;
begin
Randomize;
A:=Random(2);
case A of
0: ShowMessage('Черное');
1: ShowMessage('Белое');
2: ShowMessage('Красное');
except
ShowMessage('Что за?');
end;

В этом случае каждое из значений будет выпадать с вероятностью 33,33%, а мне нужно, чтобы черное с 40%, белое с 40%, а красное с 20% например. smile

Добавлено через 13 минут и 10 секунд
Причем список генерируется динамически пользователем (Черное - 10 %, Белое - 20 %, Серое - 10 %, Красное - 5%, оранжевое - 3%, но в сумме все равно 100 % должно быть).
PM WWW ICQ   Вверх
Rennigth
Дата 15.6.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



MadCoder, ну например создавать массив из 100 элементов с нужным тебе количеством разных елементов. Например 40 - Черных, 40-белых и 20 красных. Потом рендомить индекс массива.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MadCoder
Дата 15.6.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



ммм, а как это будет выглядеть кодом? smile 
PM WWW ICQ   Вверх
Rrader
  Дата 15.6.2008, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Код

procedure TForm1.Button1Click(Sender: TObject);
var
  A: array[0..99] of Byte;
  I: Integer;
begin
  for I := 0 to 99 do
    if I < 40 then A[I] := 0
    else if I < 80 then A[I] := 1
    else A[I] := 2;
  Randomize;
  case A[Random(High(A))] of
    0: ShowMessage('Черное');
    1: ShowMessage('Белое');
    2: ShowMessage('Красное');
  end;
end;



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
1Andrey1
Дата 16.6.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.9.2007

Репутация: 1
Всего: 4



а вот так не проще?

Код

x:=random(99);
case x of
0..39:showmessage('Черное');
40..79:showmessage('Белое');
80..99:showmessage('Красное');
end;

PM MAIL ICQ   Вверх
Beltar
Дата 18.6.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

а вот так не проще?


Неа. smile Т. к. надо не Random(99), а Random(100). ;) 

Цитата

In Delphi code, Random returns a random number within the range 0 <= X < Range. If Range is not specified, the result is a real-type random number within the range 0 <= X < 1.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
MadCoder
Дата 20.6.2008, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(1Andrey1 @ 16.6.2008,  22:59)
а вот так не проще?

Код

x:=random(99);
case x of
0..39:showmessage('Черное');
40..79:showmessage('Белое');
80..99:showmessage('Красное');
end;

Цитата(MadCoder @  14.6.2008,  18:34 Найти цитируемый пост)
Причем список генерируется динамически пользователем (Черное - 10 %, Белое - 20 %, Серое - 10 %, Красное - 5%, оранжевое - 3%, но в сумме все равно 100 % должно быть).


PM WWW ICQ   Вверх
Beltar
Дата 20.6.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Ну можно например заюзать массив. Примерно в таком ключе.
Код

type
  TMyColors=(red,blue,white);
var
  M:array[0..2] of integer;
  i:Integer;
  r,s:Integer;
  ball:TMyColors;
begin
M[Integer(red)]:=Вероятность красного;
//и т. д. Потом ес-но проверить, что сумма вероятностей = 100
Randomize;
r:=Random(100);
s:=0;
for i:=0 to High(M) do
  begin
  s:=s+M[i];
  if S>r then//строгое неравенство из-за того, что начинается с нуля.
    begin
    ball:=TMyColors(i);
    break;
    end;
  end;
end


Это сообщение отредактировал(а) Beltar - 20.6.2008, 09:18


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
MadCoder
Дата 20.6.2008, 12:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Готово smile .
user posted image

Скачать


Можно ввести в списки до 100 элементов, указать их процентную вероятность (не больше 100 все!) и проверить вероятность на практике.
Опытные товарищи, посмотрите пожалуйста код и скажите, все ли правильно считается с процентной вероятностью.
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.