从随机中断形成三角形



拿下面的问题:你有一个段[0,1]。您可以随机选择此段上的两个点。这些点将段划分为三个较小的段。这些段形成三角形的概率是多少?

有谁知道如何为此设计一个离散程序,它将用整数 1 到 100 模拟这个问题,并能够判断是否可以形成三角形?

谢谢,如果没有,很抱歉浪费你的时间。

您正在寻找采样,似乎您不想要离散而是连续的采样。

C# 代码:

private static Random s_Random = new Random();
private static bool TestForTriangle() {
double x1 = s_Random.NextDouble();
double x2 = s_Random.NextDouble();
double a, b, c;
if (x1 < x2) {
a = x1;
b = x2 - x1;
c = 1.0 - x2;
}
else {
a = x2;
b = x1 - x2;
c = 1.0 - x1;
}
return (a < b + c) && (b < a + c) && (c < a + b);
}

int n = 1000000;
double success = 0.0;
for (int i = 0; i < n; ++i)
if (TestForTriangle())
success += 1.0;
double probability = success / n;
Console.Write(probability);

结果(可能有所不同(:

0.250204 

如您所见,我们对1/4 == 0.25有一个很好的估计。

编辑整数采样(随机x1,x2在[1..100]内(是有偏差的:

private static bool TestForTriangle() {
// 1 - left iclusive; 101 - exclusive: so we have [1..100] range
int x1 = s_Random.Next(1, 101);
int x2 = s_Random.Next(1, 101);
int a, b, c;
if (x1 < x2) {
a = x1;
b = x2 - x1;
c = 100 - x2;
}
else {
a = x2;
b = x1 - x2;
c = 100 - x1;
}
return (a > 0) && (b > 0) && (c > 0) && // you may want to comment this out
(a < b + c) && (b < a + c) && (c < a + b);
}

典型的结果是这样的

0.235566

这是node中的一个解决方案.js(我不是在为你做Python作业(,它生成一百万个随机三元组,并计算如果三个段折叠在一起,其中有多少可以形成一个合法三角形。

let count = 0;
let samples = 1e6;
for (let i = 0; i < samples; ++i) {
let x1 = Math.random();
let x2 = Math.random();
let a = Math.min(x1, x2);       // first segment
let b = Math.max(x1, x2) - a;   // second segment
let c = 1 - (a + b);            // third segment
let valid = (a + b) > c && (a + c) > b && (b + c) >a;
if (valid) ++count;
}
console.log(count / samples);

最新更新