Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Вниз

Еще раз о тервере   Найти похожие ветки 

 
12 ©   (2011-01-10 10:49) [0]


> Я выбиpаю два случайных числа и говоpю вам одно из них.
> Вам нужно угадать больше оно или меньше втоpого числа. Есть
> ли метод более пpодуктивный чем случайный ответ "меньше"
> или "больше" (т.е. с веpоятностью пpавильного ответа больше
> чем 0.5)?  
>
> Ответ:
> Выберите любую совокупную функцию вероятности P (x) такую
> что a > b == > P (a) > P (b). Теперь, если показанный номер
> - y, предположение "ниже" с вероятностью P (y) и "выше"
> с вероятностью 1-P (y). Эта стратегия дает вероятность угадывания
> > 1/2, так как вероятность ответа являющимся правильным
> - 1/2 * ((1-P (a)) + P (b)) = 1/2 + (P (b) -P (a)), что
> > 1/2.

всегда думал и всегда удивлялся
экспериментальная проверка, но что-то много угадываний, где косяк?
не мудрствуя лукаво, берем P(x) = 1*x;

procedure TForm1.Button1Click(Sender: TObject);
const n = 9999999;
var
x,y:double;
count:integer;
RAnswert:integer;

function MainAnswert(ax :double): boolean;
//по пришедшему числу предсказываем, будет ли следующее больше
//т.е. берем еще одно случайно, и если оно больше
// предсказываем, что второе тоже больше
// с меньше - наоборот
var TmpVal: double;
begin
  TmpVal := random;
  Result := false;
  if TmpVal > ax then Result := true;
end;

begin
randomize;
count := 0;
RAnswert := 0;
repeat
  inc(count);
  x := random; //загадываем первое число
  y := random; //второе
  if (y > x) then
  begin
     if MainAnswert(x) then //если предсказание на больше совпадает
      inc(RAnswert) else
      dec(RAnswert);
  end;
  if (x > y) then
  begin
    if not(MainAnswert(x)) then //если предсказание на меньше совпадает
      inc(RAnswert) else
      dec(RAnswert);
  end;
until count > n;

ShowMessage( inttostr(RAnswert)) // около 0 если - нет выигрыша в стратегии

end;


 
Думкин ©   (2011-01-10 11:01) [1]


> но что-то много угадываний, где косяк?

результаты дай.


 
Думкин ©   (2011-01-10 11:05) [2]

ну, и я бы отношение смотрел - удачных попыток к неудачным.


 
12 ©   (2011-01-10 11:14) [3]


> результаты дай.

66 % правильно


 
Думкин ©   (2011-01-10 11:24) [4]

Ну, все верно. Ты ожидаешь. что теретье случайное число попадет в тот же отрезок, что и второе. Мат ожидание - 1/3.


 
Думкин ©   (2011-01-10 11:25) [5]

Или 2/3 - надо аккуратнее расписать.


 
12 ©   (2011-01-10 11:40) [6]


> 2/3

да, вообще то


 
Curse ©   (2011-01-10 11:45) [7]

> a > b == > P (a) > P (b)
Твенти, ты попутал плотность вероятности с функцией распределения. По твоей логике получается, что вероятность выбора наибольшего b равна 1, то есть всегда должно появляться наибольшее b.


 
12 ©   (2011-01-10 11:57) [8]


> Curse ©   (10.01.11 11:45) [7]

нет
еще раз прочитай условие внимательно


 
Curse ©   (2011-01-10 12:12) [9]

Сорри


 
McSimm ©   (2011-01-10 12:22) [10]

А если в MainAnswer заменить TmpVal = 0.5;
?

(нет компилятора под рукой проверить)


 
Думкин ©   (2011-01-10 12:23) [11]


> McSimm ©   (10.01.11 12:22) [10]

3 к 1.


 
TUser ©   (2011-01-10 13:03) [12]

Фокус:

Твоя программа ввыводит 3336252, то есть треть. Замени функцию на

function MainAnswert (ax: double): boolean;
begin
 result := ax < 0.5;
end;

будет 5006540, то есть аж половина. :-)


 
12 ©   (2011-01-10 13:07) [13]


> TUser ©   (10.01.11 13:03) [12]

уже вижу

> Думкин ©   (10.01.11 12:23) [11]
>
>
> > McSimm ©   (10.01.11 12:22) [10]
>
> 3 к 1.

т.е.
75%

логично, все вообще-то
зря удивлялся раньше


 
12 ©   (2011-01-10 13:54) [14]

несколько модифицировано
и все равно работает

const
 n = 9999999;
var
 x,y: double;
 count: integer;
 RAnswert: integer;
 Range: Integer;

 function MainAnswert(ax :integer): boolean;
 var
   TmpVal: double;
 begin
   TmpVal := random(random(n));  // второй игрок тоже берет случайно до какого числа он играет
   Result := false;
   if TmpVal > ax then
     Result := true;
 end;

begin
 randomize;
 count := 0;
 RAnswert := 0;
 repeat
   inc(count);
   Range := Random(n); // первый игрок случайно определяет до какого числа он играет
   x := random(Range); // загадываем первое число
   y := random(Range); // второе
   if (y > x) then
   begin
      if MainAnswert(round(x)) then //если предсказание на больше совпадает
       inc(RAnswert) else
       dec(RAnswert);
   end;
   if (x > y) then
   begin
     if not(MainAnswert(round(x))) then //если предсказание на меньше совпадает
       inc(RAnswert) else
       dec(RAnswert);
   end;
 until count > n;
 ShowMessage( inttostr(RAnswert)) // около 0 если - нет выигрыша в стратегии


 
Думкин ©   (2011-01-10 14:02) [15]


> будет 5006540, то есть аж половина. :-)

я вот меняю, у меня 3 к 1 получается всю дорогу. Ошибка в 17-й?


 
TUser ©   (2011-01-10 14:25) [16]

E:\temp>aaa
4996386

E:\temp>aaa
4998624

E:\temp>aaa
5004274

E:\temp>aaa
4995320

E:\temp>aaa
4995790

{$apptype console}

const n = 9999999;
var
x,y:double;
count:integer;
RAnswert:integer;

{
function MainAnswert(ax :double): boolean;
//по пришедшему числу предсказываем, будет ли следующее больше
//т.е. берем еще одно случайно, и если оно больше
// предсказываем, что второе тоже больше
// с меньше - наоборот
var TmpVal: double;
begin
 TmpVal := random;
 Result := false;
 if TmpVal > ax then Result := true;
end;
}

function MainAnswert (ax: double): boolean;
begin
 result := ax < 0.5;
end;

begin
randomize;
count := 0;
RAnswert := 0;
repeat
 inc(count);
 x := random; //загадываем первое число
 y := random; //второе
 if (y > x) then
 begin
    if MainAnswert(x) then //если предсказание на больше совпадает
     inc(RAnswert) else
     dec(RAnswert);
 end;
 if (x > y) then
 begin
   if not(MainAnswert(x)) then //если предсказание на меньше совпадает
     inc(RAnswert) else
     dec(RAnswert);
 end;
until count > n;

writeln (RAnswert) // около 0 если - нет выигрыша в стратегии

end.


 
Думкин ©   (2011-01-10 14:35) [17]

program Project1;

{$APPTYPE CONSOLE}
uses
 SysUtils, Dialogs;

const n = 9999999;
var
x,y:double;
count:integer;
RAnswert:integer;
LAnswert:integer;

function MainAnswert(ax :double): boolean;
begin
 Result := ax<0.5;
end;

begin
randomize;
count := 0;
RAnswert := 0;
LAnswert :=0;
repeat
 inc(count);
 x := random; //загадываем первое число
 y := random; //второе
 if (y > x) then
 begin
    if MainAnswert(x)
       then inc(RAnswert)
       else inc(LAnswert);
 end;
 if (x > y) then
 begin
   if not(MainAnswert(x))
      then inc(RAnswert)
      else inc(LAnswert)
 end;
until count > n;

ShowMessage(floattostr(RAnswert/LAnswert))

end.


3 получается у меня. :(


 
12 ©   (2011-01-10 14:39) [18]

все верно


> TUser ©   (10.01.11 14:25) [16]

показывает половину, т.к. вторая половина делится еще пополам, одна часть с+ другая с -

т.е. 3 части с + и одна с -

или
75% как и говорил


 
McSimm ©   (2011-01-10 16:03) [19]

75 и должно быть.
Ситуация, когда загаданные числа по разные стороны от 0,5 равновероятна ситуации, когда они оба по одну сторону. Для первой ситуации стратегия дает 100% и для второй - 50%


 
12 ©   (2011-01-10 18:35) [20]


>    Range := Random(n); // первый игрок случайно определяет
> до какого числа он играет
>    x := random(Range); // загадываем первое число
>    y := random(Range); // второе


а этот вариант интереснее


 
Думкин ©   (2011-01-11 05:35) [21]


> 75 и должно быть.

Ну да, у него же разность величин. Потому и половина получается.


 
TUser ©   (2011-01-11 10:24) [22]

> Думкин

Что обсуждаете - непонятно. Если задачи разные, то и ответы могут не совпадать. Я взял код, который в [0] и решил задачу "придумать такую функцию как ее там, чтобы данный нам код на экран выводил число побольше". Ты код заменил, то есть решал другую задачу. Если задача состоит только в том, чтобы число было как можно большим, без дополнительных уловий, типа данного нам кода, то я знаю ответ и покруче, чем твои 75%.

%)


 
Думкин ©   (2011-01-11 10:30) [23]


> Что обсуждаете - непонятно.

Мне понятно. Я не впер сразу, почему у тебя половина, а у меня 3 к 1. Потом понял, что это одно и тоже. Поэтому причем тут разные задачи - мне не ясно.


 
Думкин ©   (2011-01-11 10:31) [24]


> Если задача состоит только в том, чтобы число было как можно
> большим, без дополнительных уловий, типа данного нам кода,
>  то я знаю ответ и покруче, чем твои 75%.

проясни. Ну и пиши проще, без закидонов.


 
TUser ©   (2011-01-11 10:37) [25]

begin
 writeln (n);
end.


 
Думкин ©   (2011-01-11 10:41) [26]


> TUser ©   (11.01.11 10:37) [25]

сурово.


 
Mystic ©   (2011-01-11 12:20) [27]


> Я выбиpаю два случайных числа


Неоднозначность, необходимо уточнить распределение. Потом в проге ты, судя по всему, решаешь задачу в предположении что случайное число равномерно распределено на интервале (0,1). В этом случае все намного проще: полученное число и есть вероятность того, что второе число будет меньше :)


 
12 ©   (2011-01-11 12:57) [28]


> Mystic ©   (11.01.11 12:20) [27]

согласен, случай простейший

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

И, по ощущению, при устремлении оного И в бесконечность выигрыш стратегии сведется к нулю


 
Mystic ©   (2011-01-12 12:35) [29]

На интервале (-inf, +inf) равномерного распределения нет. А выигрыш равен нулю, например, если первое число выбирается из интервала (-1, 1), а второе число с вероятностью 50% равно -2, и с вероятностью 50% равно +2.

А если распределения обоих случайных одинаково и равно p(x), то очевидно, что если реализация первой случайной величины была p(x_0), то тогда очевидно, что значение

http://latex.codecogs.com/gif.download?\int_{-\infty}^{x_0}&space;p(x)\,dx

даст нам вероятность того, что что следующее число будет меньше x_0.


 
Mystic ©   (2011-01-12 12:55) [30]

только там вместо

если реализация первой случайной величины была p(x_0)

надо понимать

если реализация первой случайной величины была x_0


 
Mystic ©   (2011-01-12 13:18) [31]

Соответственно, если у нас два одинаковых распределения, то ставя на "больше", если первое число меньше медианы, и ставя на "меньше", если первое число больше медианы, мы получаем 75%, что иллюстрирует следующий рисунок:

http://mu.webest.net/pic/plot/plot-001.png



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.004 c
11-1233219482
chum
2009-01-29 11:58
2011.04.24
Как перевести проект с 7 на 10.


2-1295179948
azl
2011-01-16 15:12
2011.04.24
Добавление разноцветной форматированной строки в RichEdit


2-1295032117
Сергей
2011-01-14 22:08
2011.04.24
Вызов функции из функции


6-1215495439
AHTOLLlKA
2008-07-08 09:37
2011.04.24
Socks5 клиент, как состряпать запрос ?


2-1295522746
cyber-pilot
2011-01-20 14:25
2011.04.24
Вопрос про работу эксепшенов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский