从随机中断形成三角形

时间:2017-07-10 20:44:13

标签: python math

采取以下问题:你有一个段[0,1]。您可以随机选择此细分中的两个点。这些点将该段分成三个较小的段。这些线段形成三角形的概率是多少?

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

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

2 个答案:

答案 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);