采取以下问题:你有一个段[0,1]。您可以随机选择此细分中的两个点。这些点将该段分成三个较小的段。这些线段形成三角形的概率是多少?
有谁知道如何设计一个离散程序,用1到100的整数来模拟这个问题,并能判断是否可以形成三角形?
谢谢,如果没有,抱歉浪费你的时间。
答案 0 :(得分:1)
您正在寻找抽样,而您似乎并不想要离散但连续的。
C#代码:
sed -E -e 'h; s/([0-9]).*/\1/g; x; s/[^0-9]*[0-9]//; s/[0-9]*//g; H; g; s/\n//;' input
...
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
进行了很好的估计。
修改:整数采样(随机x1,1/4 == 0.25
内的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);
}
答案 1 :(得分:1)
这里是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);