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

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

第一种问题和方法

有三个变量   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 &lt; x 1 &lt; b 1 , a 2 &lt; x 2 &lt; b 2 , a 3 &lt; x 3 &lt; b 3 \ a_1&lt;x_1&lt;b_1 , a_2&lt;x_2&lt;b_2,a_3&lt;x_3&lt;b_3  a1<x1<b1,a2<x2<b2,a3<x3<b3
思路:
1、   a 3 &lt; x 3 &lt; b 3 \ a_3&lt;x_3&lt;b_3  a3<x3<b3,所以   a 3 &lt; n − x 1 − x 2 &lt; b 3 \ a_3&lt;n-x_1-x_2&lt;b_3  a3<nx1x2<b3

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

3、由2得,   n − x 1 − b 3 &gt; a 2 , n − x 1 − a 3 &lt; b 2 \ n-x_1-b_3&gt;a_2,n-x_1-a_3&lt;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 &lt; x 1 &lt; b 1 , a 2 &lt; x 2 &lt; b 2 , a 3 &lt; x 3 &lt; b 3 \ a_1&lt;x_1&lt;b_1, a_2&lt;x_2&lt;b_2,a_3&lt;x_3&lt;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 &lt; y 1 / ( y 1 + y 2 + y 3 ) ∗ n &lt; b 1 \ a_1&lt;y_1/(y_1+y_2+y_3)*n&lt;b_1  a1<y1/(y1+y2+y3)n<b1

2、若   a 1 &lt; y 1 &lt; b 1 \ a_1&lt;y_1&lt;b_1  a1<y1<b1,所以   0 &lt; 1 / ( y 1 + y 2 + y 3 ) ∗ n &lt; 1 \ 0&lt;1/(y_1+y_2+y_3)*n&lt;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 &gt; n \ y_1+y_2+y_3 &gt;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 &lt; n \ y_1+y_2+y_3 &lt;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)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值