Java 重量是否有随机变化?

Java 重量是否有随机变化?,java,random,Java,Random,我正在使用random类生成1到5之间的随机数,就像myrandom.nextInt(6)一样,它工作得很好,但是我想知道是否有一种方法可以给一个特定的数字赋予权重,以增加它出现的概率,比如说,我想要数字“4”,而不是%20的概率40%概率和其他数字1、2、3、5平均分享其余的60%概率。有办法吗 提前感谢。您必须生成更大范围的数字(如从1到100),并使用范围返回您真正想要的数字。例如:(伪代码) r=randint(1..100) 如果(r>=1&&r=21&&r,则必须生成更大范围的数字(

我正在使用random类生成1到5之间的随机数,就像myrandom.nextInt(6)一样,它工作得很好,但是我想知道是否有一种方法可以给一个特定的数字赋予权重,以增加它出现的概率,比如说,我想要数字“4”,而不是%20的概率40%概率和其他数字1、2、3、5平均分享其余的60%概率。有办法吗


提前感谢。

您必须生成更大范围的数字(如从1到100),并使用范围返回您真正想要的数字。例如:(伪代码)

r=randint(1..100)

如果(r>=1&&r=21&&r,则必须生成更大范围的数字(如从1到100),并使用范围返回您真正想要的数字。例如:(在伪代码中)

r=randint(1..100)
如果(r>=1&&r=21&&r我使用数组

int[] arr = {4, 4, 4, 5, 5, 6};
int a = arr[random.nextInt(arr.length)];
要获得更具动态性的解决方案,请尝试此方法。权重不必相加到任何特定值

public static <T> T choice(Map<? extends T, Double> map) {
    if (map == null || map.size() == 0)
        throw new IllegalArgumentException();
    double sum = 0;
    for (double w : map.values()) {
        if (Double.compare(w, 0) <= 0 || Double.isInfinite(w) || Double.isNaN(w))
            throw new IllegalArgumentException();
        sum += w;
    }
    double rand = sum * Math.random();
    sum = 0;
    T t = null;
    for (Map.Entry<? extends T, Double> entry : map.entrySet()) {
        t = entry.getKey();
        if ((sum += entry.getValue()) >= rand)
            return t;
    }
    return t;
}
publicstatict选项(MapI使用数组

int[] arr = {4, 4, 4, 5, 5, 6};
int a = arr[random.nextInt(arr.length)];
要获得更具动态性的解决方案,请尝试此方法。权重不必相加到任何特定值

public static <T> T choice(Map<? extends T, Double> map) {
    if (map == null || map.size() == 0)
        throw new IllegalArgumentException();
    double sum = 0;
    for (double w : map.values()) {
        if (Double.compare(w, 0) <= 0 || Double.isInfinite(w) || Double.isNaN(w))
            throw new IllegalArgumentException();
        sum += w;
    }
    double rand = sum * Math.random();
    sum = 0;
    T t = null;
    for (Map.Entry<? extends T, Double> entry : map.entrySet()) {
        t = entry.getKey();
        if ((sum += entry.getValue()) >= rand)
            return t;
    }
    return t;
}

public static T choice(Mappbadcefp的答案可能是最简单的。因为你在评论中说你需要它是“动态的”,这里有另一种方法。请注意,权重基本上指定了数字在数组中出现的频率

public int weightedRandom( Random random, int max, Map<Integer, Integer> weights ) {
    int totalWeight = max;
    for( int weight : weights.values() ) {
        totalWeight += weight - 1;
    }

    int choice = random.nextInt( totalWeight );
    int current = 0;
    for( int i = 0; i < max; i++ ) {
        current += weights.containsKey( i ) ? weights.get( i ) : 1;
        if( choice < current ) {
            return i;
        }
    }

    throw new IllegalStateException();
}
public int-weightedRandom(随机、int-max、映射权重){
整数总重量=最大值;
对于(int-weight:weights.values()){
总重量+=重量-1;
}
int choice=random.nextInt(总重量);
int电流=0;
对于(int i=0;i
用法示例:

Map<Integer, Integer> weights = new HashMap<>();
weights.put( 1, 0 ); // make choosing '1' impossible
weights.put( 4, 3 ); // '4' appears 3 times rather than once

int result = weightedRandom( new Random(), 5, weights );
Map weights=newhashmap();
权重。放置(1,0);//使选择“1”变得不可能
权重。放置(4,3);/“4”出现3次而不是一次
int result=weightedRandom(new Random(),5,weights);
基本上,这相当于pbadcefp在数组
{0,2,3,4,4,4}

如果你想使用百分比,你必须调整它。只需相应地计算权重。另外,我没有在这方面进行测试,所以你可能需要更广泛地测试它

这决不是一个完整的解决方案,但我更喜欢给出一些过于完整的解决方案,因为你应该自己做一些工作


我还要记录在案,说IMHO这是过度设计的;但是你想要这样的东西。

pbadcefp的答案可能是最简单的。因为你在评论中说你需要它是“动态的”,这里有一种替代方法。请注意,权重基本上指定了数字在数组中出现的频率

public int weightedRandom( Random random, int max, Map<Integer, Integer> weights ) {
    int totalWeight = max;
    for( int weight : weights.values() ) {
        totalWeight += weight - 1;
    }

    int choice = random.nextInt( totalWeight );
    int current = 0;
    for( int i = 0; i < max; i++ ) {
        current += weights.containsKey( i ) ? weights.get( i ) : 1;
        if( choice < current ) {
            return i;
        }
    }

    throw new IllegalStateException();
}
public int-weightedRandom(随机、int-max、映射权重){
整数总重量=最大值;
对于(int-weight:weights.values()){
总重量+=重量-1;
}
int choice=random.nextInt(总重量);
int电流=0;
对于(int i=0;i
用法示例:

Map<Integer, Integer> weights = new HashMap<>();
weights.put( 1, 0 ); // make choosing '1' impossible
weights.put( 4, 3 ); // '4' appears 3 times rather than once

int result = weightedRandom( new Random(), 5, weights );
Map weights=newhashmap();
权重。放置(1,0);//使选择“1”变得不可能
权重。放置(4,3);/“4”出现3次而不是一次
int result=weightedRandom(new Random(),5,weights);
基本上,这相当于pbadcefp在数组
{0,2,3,4,4,4}

如果你想使用百分比,你必须调整它。只需相应地计算权重。另外,我没有在这方面进行测试,所以你可能需要更广泛地测试它

这决不是一个完整的解决方案,但我更喜欢给出一些过于完整的解决方案,因为你应该自己做一些工作


我也会记录在案,说这是过度设计;但你想要这样的东西。

不,没有。你必须自己做。在1和数字权重之和之间选择一个随机数,然后将结果映射到对应的数字。可能是@Ingo Bürk的重复,你能给我举个例子吗做这个映射的示例?@Faruk我发布了一个快速演示作为答案。不,没有。你必须自己做。在1和数字权重之和之间选择一个随机数,然后将结果映射到对应的数字。可能重复@Ingo Bürk,你能给我一个做这个映射的示例吗?@Faruk I p我会不断地增加,减少概率,甚至删除一些数字,所以使用一个静态数组是序幕式的,即使我使用类似stringbuffer的东西,它仍然是,因为在向stringbuffer添加元素之前,我必须进行一些计算(以知道我将添加多少)@Faruk好的,我会考虑一个更动态的解决方案。我会不断增加,减少概率,甚至删除一些数字,所以使用一个静态数组是一个过程,即使我使用类似stringbuffer的东西,它仍然是,因为在向stringbuffer添加元素之前,我必须进行一些计算(以知道我将添加多少)@Faruk好的,我会考虑一个更动态的解决方案。