生成满足约束的随机数的方法

生成满足约束的随机数的方法

  • 第一种问题和方法
  • 第二种问题和方法

第一种问题和方法

有三个变量   x 1 , x 2 , x 3 \ x_1,x_2,x_3  x1x2x3
生成满足约束的值:
  x 1 + x 2 + x 3 = n \ x_1+x_2+x_3=n  x1+x2+x3=n
  a 1 < x 1 < b 1 , a 2 < x 2 < b 2 , a 3 < x 3 < b 3 \ a_1<x_1<b_1 , a_2<x_2<b_2,a_3<x_3<b_3  a1<x1<b1,a2<x2<b2,a3<x3<b3
思路:
1、   a 3 < x 3 < b 3 \ a_3<x_3<b_3  a3<x3<b3,所以   a 3 < n − x 1 − x 2 < b 3 \ a_3<n-x_1-x_2<b_3  a3<nx1x2<b3

2、由1得,   n − x 1 − b 3 < x 2 < n − x 1 − a 3 \ n-x_1-b_3<x_2<n-x_1-a_3  nx1b3<x2<nx1a3

3、由2得,   n − x 1 − b 3 > a 2 , n − x 1 − a 3 < b 2 \ n-x_1-b_3>a_2,n-x_1-a_3<b_2  nx1b3>a2,nx1a3<b2,所以,   x 1 ∈ [ n − ( b 2 + b 3 ) , n − ( a 2 + a 3 ) ] \ x_1\in [n-(b_2+b_3),n-(a_2+a_3)]  x1[n(b2+b3),n(a2+a3)]

步骤:
1、生成   x 1 ∈ [ n − ( b 2 + b 3 ) , n − ( a 2 + a 3 ) ] \ x_1\in [n-(b_2+b_3),n-(a_2+a_3)]  x1[n(b2+b3),n(a2+a3)]

2、生成   x 2 ∈ [ n − ( x 1 + b 3 ) , n − ( x 1 + a 3 ) ] \ x_2\in [n-(x_1+b_3),n-(x_1+a_3)]  x2[n(x1+b3),n(x1+a3)]

3、生成   x 3 = n − x 1 − x 2 \ x_3=n-x_1-x_2  x3=nx1x2

# python 3.6
import random

# 递归生成随机数
def generate_randval(x_low, x_up, x_sum, y):
	if len(x_low)==1:
		y.append(x_sum)
		print(x_sum)
	else:
		a = max(x_sum-sum(x_up[1:len(x_up)]), x_low[0])
		b = min(x_sum-sum(x_low[1:len(x_low)]), x_up[0])
		temp = random.uniform(a, b)
		y.append(temp)
		print(temp)
		x_low = x_low[1:len(x_low)]
		x_up = x_up[1:len(x_up)]
		x_sum = x_sum - temp
		generate_randval(x_low, x_up, x_sum, y)

if __name__=="__main__":
	x_low = [1, 2, 3]
	x_up = [3, 6, 9]
	x_sum =10  # 在6和18之间
	y = []
	generate_randval(x_low, x_up, x_sum, y)
	

第二种问题和方法

有三个变量   x 1 , x 2 , x 3 \ x_1,x_2,x_3  x1x2x3
生成满足约束的值:
  x 1 + x 2 + x 3 = n \ x_1+x_2+x_3=n  x1+x2+x3=n
  a 1 < x 1 < b 1 , a 2 < x 2 < b 2 , a 3 < x 3 < b 3 \ a_1<x_1<b_1, a_2<x_2<b_2,a_3<x_3<b_3  a1<x1<b1,a2<x2<b2,a3<x3<b3
  a 1 = a 2 = a 3 ,   b 1 = b 2 = b 3 ,   c 1 = c 2 = c 3 \ a_1=a_2=a_3, \ b_1=b_2=b_3, \ c_1=c_2=c_3  a1=a2=a3 b1=b2=b3 c1=c2=c3
思路:
1、   x 1 = y 1 / ( y 1 + y 2 + y 3 ) ∗ n \ x_1=y_1/(y_1+y_2+y_3)*n  x1=y1/(y1+y2+y3)n,所以   a 1 < y 1 / ( y 1 + y 2 + y 3 ) ∗ n < b 1 \ a_1<y_1/(y_1+y_2+y_3)*n<b_1  a1<y1/(y1+y2+y3)n<b1

2、若   a 1 < y 1 < b 1 \ a_1<y_1<b_1  a1<y1<b1,所以   0 < 1 / ( y 1 + y 2 + y 3 ) ∗ n < 1 \ 0<1/(y_1+y_2+y_3)*n<1  0<1/(y1+y2+y3)n<1

步骤:
1、生成   y 1 ∈ [ a 1 , b 1 ] \ y_1\in [a_1,b_1]  y1[a1,b1],   y 2 ∈ [ a 2 , b 2 ] \ y_2\in [a_2,b_2]  y2[a2,b2],   y 3 ∈ [ a 3 , b 3 ] \ y_3\in [a_3,b_3]  y3[a3,b3]

2、如果   y 1 + y 2 + y 3 > n \ y_1+y_2+y_3 >n  y1+y2+y3>n, 生成   x 1 = y 1 / ( y 1 + y 2 + y 3 ) ∗ n \ x_1=y_1/(y_1+y_2+y_3)*n  x1=y1/(y1+y2+y3)n   x 2 = y 2 / ( y 1 + y 2 + y 3 ) ∗ n \ x_2=y_2/(y_1+y_2+y_3)*n  x2=y2/(y1+y2+y3)n   x 3 = y 3 / ( y 1 + y 2 + y 3 ) ∗ n \ x_3=y_3/(y_1+y_2+y_3)*n  x3=y3/(y1+y2+y3)n

3、如果   y 1 + y 2 + y 3 < n \ y_1+y_2+y_3 <n  y1+y2+y3<n,生成   x 1 = y 1 ∗ n / ( y 1 + y 2 + y 3 ) \ x_1=y_1*n/(y_1+y_2+y_3)  x1=y1n/(y1+y2+y3)   x 2 = y 2 ∗ n / ( y 1 + y 2 + y 3 ) \ x_2=y_2*n/(y_1+y_2+y_3)  x2=y2n/(y1+y2+y3)   x 3 = y 3 ∗ n / ( y 1 + y 2 + y 3 ) \ x_3=y_3*n/(y_1+y_2+y_3)  x3=y3n/(y1+y2+y3)

你可能感兴趣的:(数据结构与算法)