当前位置: 代码迷 >> 编程 >> 生产三个[0,1)的随机数相加为一
  详细解决方案

生产三个[0,1)的随机数相加为一

热度:5971   发布时间:2013-02-26 00:00:00.0
生产三个[0,1)的随机数相加为1

刚在在开源中国上看到的这个问题:http://www.oschina.net/question/817257_90108

如何产生3个在[0-1]之间并且和为1的随机数?

?

解法:

a=rnd(),b=rnd()

随机数1=min(a, b)

随机数2=abs(a - b)

随机数3=1 - max(a, b)

# -*- coding:utf-8 -*-from visual import *import randompointer_x = arrow(pos=(0,0,0), axis=(1,0,0), shaftwidth=0.01)pointer_y = arrow(pos=(0,0,0), axis=(0,1,0), shaftwidth=0.01)pointer_z = arrow(pos=(0,0,0), axis=(0,0,1), shaftwidth=0.01)poslist=[];colorlist=[color.red,color.yellow,color.green]#方案一for i in xrange(10000):    a=random.random()    b=random.random()    x1=min(a,b)    x2=abs(a-b)    x3=1-max(a,b)    points(pos=(x1,x2,x3), size=2, color=random.choice(colorlist))

?

?

生成图像:

?

?

?

?

?

下面是一种容易想到的解法。生成是随机的,但分布不均匀。

?

不均匀解:

Double a=Math.random()

Double b=Math.random()*(1-a)

Double c=1-a-b

# -*- coding:utf-8 -*-from visual import *import randompointer_x = arrow(pos=(0,0,0), axis=(1,0,0), shaftwidth=0.01)pointer_y = arrow(pos=(0,0,0), axis=(0,1,0), shaftwidth=0.01)pointer_z = arrow(pos=(0,0,0), axis=(0,0,1), shaftwidth=0.01)poslist=[];colorlist=[color.red,color.yellow,color.green]#方案二for i in xrange(5000):    x1=random.random()    x2=random.uniform(0,1-x1)    x3=1-x1-x2    points(pos=(x1,x2,x3), size=2, color=random.choice(colorlist))

?

?

?生成图像:

?



?

  相关解决方案