算法-输入一个数,然后根据概率输出相应字符串的算法

算法-输入一个数,然后根据概率输出相应字符串的算法

虐人心 发布于 2017-07-14 字数 257 浏览 1226 回复 2

编写一个程序,输入为N(正整数),读入文件A.txt,按照字符串出现概率随机地输出字符串,输出N条记录
例如:
输入文件A.txt
abc20
a30
de50
输入为:10
即 abc有20%的概率输出,a有30%的概率输出,de有50%的概率输出,输出10条记录

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-08-10 2 楼

P[0] = 0.2, P[1] = 0.3, P[2] = 0.5
F[0] = 0.0, F[1] = 0.2, F[2] = 0.5, F[3] = 1.0
F称为累积分布函数,定义是F[k] = P[0] + P[1] + ... + P[k]
生成一个随机数p,如果F[k] <= p < F[k+1], 输出第k项
代码就不用写了吧

清晨说ぺ晚安 2017-07-27 1 楼

import java.util.*;
import java.io.*;
public class Test
{
/**
* @param args
* 简单的解释下
* 假设取得随机数的概率是均匀的,那么可以这么表示:
* { 概率为0.2的区域 | 概率为0.3的区域 |概率为0.5的区域 |}=Long.MAX_VALUE-1
*/
public static void main(String args[])
{
long z=Long.MAX_VALUE-1;
//假设抽取Long.MAX_VALUE-1中的任意一个数是概率是1/(Long.MAX_VALUE-1)
File a=new File("A.txt");
Scanner s=new Scanner(System.in);
System.out.println("请输入行数N");
int x=s.nextInt();
try {
BufferedWriter wr=new BufferedWriter(new FileWriter(a));
while(x>0)
{
wr.flush();
long ran=(long) (Math.random()*Long.MAX_VALUE);
if(ran<=z*0.2)
wr.write("abc20rn");
else if(ran<=z*(0.2+0.3))
wr.write("a30rn");
else if(ran<=z)
wr.write("de50rn");
x--;
}
wr.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}