2015-10-27 164 views
0

如何与概率例如30%产生随机(1100)整数,如果号范围从(150)随机产生整数,并用概率70%如果号范围从( 50100)?JAVA:与概率

int integer = new Random().nextInt(100) + 1; 

// Probabilities 
    ..... code here .... 

我该怎么做?

+1

重复https://stackoverflow.com/questions/20327958/random-number-with-probabilitieshttps://stackoverflow.com/questions/20327958/random-number-with-probabilities编辑:嗯这是奇怪的。 。如果你直接点击链接,它会提供一个404,但它可以通过谷歌https://www.google.com/search?q=questions%2F20327958%2Frandom-number-with-probabilities&oq=questions%2F20327958%2Frandom-number- with-probabilities&aqs = chrome..69i57j69i58j69i60.5166j0j8&sourceid = chrome&es_sm = 91&ie = UTF-8 –

+0

@MichaelJames正确的链接是https://stackoverflow.com/questions/20327958/random-number-with-probabilities – Andreas

+0

这是一个中文网站[用概率随机生成整数](http://www.360doc.com/content/10/1208/14/2960485_76121195.shtml) –

回答

4

这是一个方法getRandom()它返回一个符合您指定的标准的随机数。它实际上使用09之间的一个随机数来确定使用哪个范围。

public int getRandom() { 
    Random random = new Random(); 
    int val = random.nextInt(10); 

    if (val < 3) { 
     return random.nextInt(50) + 1;  // random range 1 to 50 
    } 
    else { 
     return random.nextInt(51) + 50;  // random range 50 to 100 
    } 
} 
+1

你的意思是'+ 51' – Andreas

+0

非常感谢@Tim Biegeleisen这就是答案。 – Crowni

1

这是一个通用的解决方案,将返回任意数量的事件之一,您可以在其中指定事件的相对权重。权重可能是概率,但他们不必;例如,如果您有三个事件,并且您希望第一个事件的可能性为20%,第二个30%和第三个50%,则可以在每个事件上调用addEvent以2,3和5作为第二参数,或者20,30和50或者0.2,0.3和0.5,或者具有那些比率的任何其他数字组合。对于你的情况,你可以使通用参数为间隔并添加两个权重为3和7(或30和70,或其他)的事件;那么,当你打电话randomEvent,并返回与端点mn包容的间隔,那么你在生成该区间另一个随机数:

value = m + random.nextInt(n - m + 1); 

其中random是你自己的Random实例。

class RandomDistribution<T> { 

    private class Event { 
     public final T event; 
     public final double relativeWeight; 
     public Event(T event, double relativeWeight) { 
      this.event = event; 
      this.relativeWeight = relativeWeight; 
     } 
    } 

    private double totalWeight = 0D; 
    private ArrayList<Event> events = new ArrayList<>(); 
    private Random generator = new Random(); 

    public void addEvent(T event, double relativeWeight) { 
     events.add(new Event(event, relativeWeight)); 
     totalWeight += relativeWeight; 
    } 

    public T randomEvent() { 
     double random = generator.nextDouble() * totalWeight; 
     for (Event event : events) { 
      random -= event.relativeWeight; 
      if (random < 0D) { 
       return event.event; 
      } 
     } 
     // It's possible to get here due to rounding errors 
     return events.get(events.size() - 1).event; 
    } 

}