Как расширить диапазон случайных значений от 0 до 1 включительно?

Здравствуйте, господа программисты, мне предложили решить такую задачу - в промежутке [0;1] выбираются случайным образом a и b, так что x^2 + a*x - 2*b = 0. Величина k = max(x1,x2). Найти вероятность того что k > 1.

Я реализовал программу на си, которая находит эту вероятность:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

using namespace std;
long double max(long double x1, long double x2)
{
	return x1 > x2 ? x1 : x2;
}
int main()
{
	setlocale(LC_ALL, "");
	srand(time(NULL));

	int n, count, N = 0;
	long double a, b, discr, x1, x2;

	cout << "Введите количество экспериментов:"; cin >> n;

	for(int i = 1; i <= n; i++)
	{
		a = double(rand() % 1000000000000) / double(1000000000000);
		b = double(rand() % 1000000000000) / double(1000000000000);
		discr = a*a - 8*b;
		x1 = (-a + pow(discr, 1.0/2.0))/2.0;
		x2 = (-a - pow(discr, 1.0/2.0))/2.0;

		if(discr < 0)
			continue;
		else if( max(x1,x2) > 1 )
		{
			cout << "При a = " << a << " и b = " << b << " x1 = " << x1 << " x2 = " << x2 << " max = " << max(x1,x2) << endl;
			++count;
		}
	}

	 printf("\nP(A) = %.10f", float(count) / float(n));

return 0;
}


но даже при миллиарде экспериментов выдает вероятности 0, есть подозрения что проблема в диапозоне случайных чисел, как его расширить?
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала стоит проверить, есть ли вообще значения x большие единицы.
D = a2 + 8×b, D ∈ [0, 9]
x1 = (−a + √D) / 2, x1 ∈ [-1, √2]
x2 = (−a − √D) / 2, x1 ∈ [-2, 0]

Нужные значения есть. И достигаются они только у одного из корней. Значит есть смысл писать программу и определять вероятность методом Монте-Карло.

const monteCarlo = (tryCount) => {
  let positive = 0;
  for (let i = 0; i < tryCount; i += 1) {
    const a = Math.random();
    const b = Math.random();
    const D = a * a + 8 * b;
    const x = (-a + Math.sqrt(D)) / 2;
    if (x > 1) {
      positive += 1;
    }
  }
  return(positive / tryCount);
}
monteCarlo(1000000); // 0.249374
monteCarlo(10000000); // 0.2500279


А теперь решим аналитически. Нам надо найти соотношение площадей квадрата (0,0)-(1,1) и той его части, на которой x > 1.
Для этого решим уравнение
(−a + √(a2 + 8×b)) / 2 > 1
−a + √(a2 + 8×b) > 2
√(a2 + 8×b) > a + 2
a2 + 8×b > a2 + 4×a + 4
8×b > 4×a + 4
b > (a + 1) / 2
Если нарисовать график прямой b = (a + 1) / 2, то получим, что она отделяет 1/4 площади квадрата. Таким образом, учитывая равномерное распределение a и b, искомая вероятность 0.25.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
discr = a*a - 8*b;
надо +
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы