日期:2014-05-20  浏览次数:20738 次

随机数生成概率
请问下,我现在要随机生成一个无向图邻接矩阵,我如何控制两个顶点有边的概率等于0.6?不知道我有没有表达清我的意思,各位大神帮我看下,谢谢。
int vertexNum = 20;
int a[][] = new int[vertexNum][vertexNum];


// 随机生成邻接矩阵
Random r = new Random();
for (int i = 0; i < vertexNum; i++)
for (int j = vertexNum - 1; j >= i; j--)
{
if (i == j)
a[i][j] = 0;
else
{
a[i][j] = r.nextInt(2);
a[j][i] = a[i][j];
}
}

------解决方案--------------------

a[i][j] = r.nextInt(10)<=6?1:0; //这里1就表示有线,0表示无线

------解决方案--------------------
引用:

a[i][j] = r.nextInt(10)<=6?1:0; //这里1就表示有线,0表示无线

应该是nextInt(11)吧.
------解决方案--------------------
LZ可以这么做:搞一个Map<Integer,Integer> map,然后如下:
map.put(0,1);
map.put(1,1);
map.put(2,1);
map.put(3,1);
map.put(4,1);
map.put(5,1);
map.put(6,0);
map.put(7,0);
map.put(8,0);
map.put(9,0);

然后 Integer value=map.get(r.nextInt(10));
这样,value有10分之6的概率为1,LZ可以根据这个value来决定是否有边。

当然,如果需要更高的精度,map的规模可以扩展,0、1值也可以错开。
------解决方案--------------------
这个 0.6 概率如果需要比较精确的话,可以这样:

假定所有边数量为 n,那么随机选择点并生成边的数量控制为 0.6n 即可。
------解决方案--------------------
雖然看不懂,但是還是先看看思路為日後打基礎
------解决方案--------------------
这是数学LZ,只要有均匀分布的随机数发生器,通过变换可以得到任意分布的随机数。

jvm 默认给的是伪随机数,分布特征可能不完全是均匀分布,当然有待考证。
LZ当然也可以自己实现随机数生成器。

需要真随机数的话,JVM需要在某处设置一下,具体我忘了,可以google下。
真随机数,就是指收集机器物理噪音产生的随机数,Linux下有个命令的,具体拼法我也给忘了。
年纪大了,记性不行了。唉。