Форум: "Прочее";
Текущий архив: 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