有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据字母的使用频率随机生成字母?

如何根据字母在常用语音中的使用频率随机生成字母

任何伪代码都值得欣赏,但用Java实现就太棒了。否则,只要往正确的方向戳一下就有帮助了

注意:我不需要生成使用频率——我相信我可以很容易地找到它


共 (5) 个答案

  1. # 1 楼答案

    甚至不是伪代码,但可能的方法如下:

    让p1,p2。。。,pk是你想要匹配的频率

    1. 计算累积频率:p1,p1+p2,p1+p2+p3,一,
    2. 生成一个随机均匀(0,1)数x
    3. 检查累积频率x所属的间隔:如果它介于p1+之间+pi和p1++pi+p(i+1),然后输出(i+1)第一个字母

    根据实施间隔查找的方式,如果p1、p2,。。。是按降序排序的,因为通常会更快地找到包含x的区间

  2. # 2 楼答案

    我要做的是将相对频率缩放为浮点数,使其总和为1.0。然后,我将创建一个每个字母的累计总数数组,即必须加在顶部才能得到该字母和所有“低于”字母的数字。假设A的频率为10%,b为2%,z为1%;然后你的桌子看起来像这样:

    0.000 A ; from 0% to 10% gets you an A
    0.100 B ; above 10% is at least a B
    0.120 C ; 12% for C...
    ...
    0.990 Z ; if your number is >= 99% then you get a Z
    

    然后你自己生成一个介于0.0和1.0之间的随机数,并在数组中进行二进制搜索,寻找比随机数小的第一个数。然后在那个位置选择字母。完成了

  3. # 3 楼答案

    一种快速的方法是生成一个字母列表,每个字母都按照其频率出现在列表中。比如说,如果25.6%的时间使用“e”,而你的列表长度为1000,那么它将有256个“e”

    然后,你可以通过使用(int) (Math.random() * 1000)从列表中随机选取点,生成0到999之间的随机数

  4. # 4 楼答案

    我假设你将频率存储为0到1之间的浮点数,总数等于1

    首先,你应该准备一个累积频率表,即该字母和之前所有字母的频率之和

    为了简化,如果你从这个频率分布开始:

    A  0.1
    B  0.3
    C  0.4
    D  0.2
    

    您的累积频率表将是:

    A  0.1
    B  0.4 (= 0.1 + 0.3)
    C  0.8 (= 0.1 + 0.3 + 0.4)
    D  1.0 (= 0.1 + 0.3 + 0.4 + 0.2)
    

    现在生成一个介于0和1之间的随机数,看看这个数字在这个列表中的位置。选择累积频率最小且大于随机数的字母。例如:

    假设你随机选择0.612。这介于0.4和0.8之间,即B和C之间,所以选择C

    如果你的随机数是0.039,则在0.1之前,即在A之前,所以选择A

    我希望这是有道理的,否则请随时要求澄清

  5. # 5 楼答案

    使用二叉树为您提供了一种很好的、干净的方法来找到正确的条目。在这里,您从一个frequency映射开始,其中键是符号(英文字母),值是它们出现的频率。这将被反转,并创建一个NavigableMap,其中键是累积概率,值是符号。这使得查找变得容易

      private final Random generator = new Random();
    
      private final NavigableMap<Float, Integer> table = 
        new TreeMap<Float, Integer>();
    
      private final float max;
    
      public Frequency(Map<Integer, Float> frequency)
      {
        float total = 0;
        for (Map.Entry<Integer, Float> e : frequency.entrySet()) {
          total += e.getValue();
          table.put(total, e.getKey());
        }
        max = total;
      }
    
      /** 
       * Choose a random symbol. The choices are weighted by frequency.
       */ 
      public int roll()
      {
        Float key = generator.nextFloat() * max;
        return table.higherEntry(key).getValue();
      }