Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.24;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.009 c
15-1294645762
12
2011-01-10 10:49
2011.04.24
Еще раз о тервере


15-1294911645
stenfit
2011-01-13 12:40
2011.04.24
работа с zip


2-1295504959
Novi4ok1992
2011-01-20 09:29
2011.04.24
Выбор языка интерфейса в программе


1-1252912417
KSergey
2009-09-14 11:13
2011.04.24
DLL и глобальные переменные


2-1295517155
Alex_C
2011-01-20 12:52
2011.04.24
Как в метафаил скопировать битмап?