我不確定TreeMap
是否真的是最好的數據結構,但是。 。 。
您可以使用the Math.random()
method獲取0.0
(含)和1.0
(不含)之間的隨機值。然後,迭代你的地圖元素,積累他們的頻率,直到你超過這個值。首先超過此值的後綴是您的結果。假設你的地圖元素的頻率全部合計爲1.0
,這將選擇與它們的頻率成比例的所有後綴。
例如:
public class Demo
{
private final Map<String, Double> suffixFrequencies =
new TreeMap<String, Double>();
private String getRandomSuffix()
{
final double value = Math.random();
double accum = 0.0;
for(final Map.Entry<String, Double> e : suffixFrequencies.entrySet())
{
accum += e.getValue();
if(accum > value)
return e.getKey();
}
throw new AssertionError(); // or something
}
public static void main(final String... args)
{
final Demo demo = new Demo();
demo.suffixFrequencies.put("abc", 0.3); // value in [0.0, 0.3)
demo.suffixFrequencies.put("def", 0.2); // value in [0.3, 0.5)
demo.suffixFrequencies.put("ghi", 0.5); // value in [0.5, 1.0)
// Print "abc" approximately three times, "def" approximately twice,
// and "ghi" approximately five times:
for(int i = 0; i < 10; ++i)
System.out.println(demo.getRandomSuffix());
}
}
注:
- 由於舍入誤差,則可能
throw new AssertionError()
實際上將發生,每隔一段時間,儘管非常罕見。所以我建議你用一些總是選擇第一個元素或最後一個元素或某物的東西來替換該行。
- 如果頻率不是全部合計爲1.0,那麼您應該在
getRandomSuffix()
的開頭處添加一個合格的合格數來確定所有頻率的總和。然後您可以相應地縮放value
。
這個問題主要是數學問題嗎? – durron597
數學不是困難的部分。我知道如果一個後綴出現一次並且子字符串在文本中出現兩次,那麼它的概率是1/2,因此在文本生成器中出現1/2的時間。但是,手頭的問題是如何獲取這些信息,並從中產生一個「隨機」字符。 – user1547050