Имаме една права линия. Чупим я на две случайни места.
Какъв е шанса да може да построим триъгълник от образуваните парчета?
Sup3rlum написа:Имаме една права линия. Чупим я на две случайни места.
Какъв е шанса да може да построим триъгълник от образуваните парчета?
(подчертаното направих аз), че в решенията, които предлагаме, се използва крайният резултат от чупенето като дължини на отсечки.KOPMOPAH написа:Може да се поразшири задачата още малко. ...
На действието "чупене на две случайни места" може да се придаде друг смисъл, а именно - пръчката се чупи на случайно място и после по случаен начин се избира една от двете части, която също по случаен начин (т.е. на случайно място) се чупи. Каква е вероятността в този случай от частите да се направи триъгълник?
from __future__ import division
import random
def f1():
bust = 0
N = 100000000
for i in range(N):
p1,p2 = random.random(),random.random()
s1 = min(p1,p2)
s2 = max(p1,p2) - s1
s3 = 1 - ( s1+s2)
#print s1,s2,s3 , s1+s2+s3
if s1 >=0.5 or s2 >= 0.5 or s3>= 0.5:
bust += 1
print (1 - (bust /N) )
def f2():
bust = 0
N = 100000000
for i in range(N):
p1 = random.random()
s01,s02 = p1, 1-p1
c = random.random()
if c < 0.5:
pm1 = s01*random.random()
s1,s2,s3 = pm1, s01 - pm1, s02
else:
pm2 = s02*random.random()
s1,s2,s3 = s01, pm2, s02-pm2
#print s1,s2,s3 , s1+s2+s3
if s1 >=0.5 or s2 >= 0.5 or s3>= 0.5:
bust += 1
print (1 - (bust /N))
if __name__ == '__main__':
f1()
f2()
using System;
namespace TriangleTest
{
class Program
{
static int trials = 1000000;
static int succeeded1 = 0;
static int succeeded2 = 0;
static Random r;
static void Main(string[] args)
{
r = new Random();
for (int i = 0; i < trials; i++)
{
double a = r.NextDouble();
double b = r.NextDouble();
if (a != b)
{
if (b > a)
{
if (TriangleRule(a,b-a,1-b))
{
succeeded1++;
}
}
else
{
if (TriangleRule(b, a - b, 1 - a))
{
succeeded2++;
}
}
}
else
{
Console.WriteLine("same");
}
}
Console.WriteLine("Ordered fixed: ");
Console.WriteLine((float)succeeded1 / (float)trials);
Console.WriteLine("Non-ordered fixed: ");
Console.WriteLine((float)(succeeded1+succeeded2) / (float)trials);
Console.ReadKey();
}
static bool TriangleRule(double p1, double p2, double p3)
{
return
(
p1 < p2 + p3 &&
p2 < p1 + p3 &&
p3 < p2 + p2
);
}
}
}
drago написа:.....
Sup3rlum написа:...Това ограничава възможността, защото по-голямата пръчка не винаги покрива интервала $(\frac{1}{2};1)$ напълно. Ако сметнеш и вероятностите в които по-голямата пръчка не покрива интервала, получаваш $\frac{3}{4}-ln2$. И като събереш двете получаваш... $\frac{1}{4}$
Регистрирани потребители: Google [Bot]