生成Java中另一个整数的范围倍数的随机整数

时间:2018-11-29 21:14:32

标签: java algorithm random integer

我正在努力完成实用程序方法,以生成2个整数范围内的数字,该数字也是另一个整数的倍数。

例如:

CS0012  The type 'IQbservable<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Reactive.Providers, Version=1.0.10621.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. 

应产生 444 888 。没什么。

我想出了这个解决方案:

    static IQStreamable<TCQuote> CreateStream(Application application, bool isRealTime)
    {
        DateTime startTime = new DateTime(2011, 1, 1);

        if (isRealTime)
        {
            // Live data uses IQbservable<>
            return
                application.DefineObservable(() => SimulateLiveData()).ToPointStreamable(
                    r => PointEvent<SensorReading>.CreateInsert(startTime.AddSeconds(r.Time), r),
                    AdvanceTimeSettings.StrictlyIncreasingStartTime);
        }

        // Historic data uses IQueryable<>
        return
            application.DefineEnumerable(() => HistoricData).ToPointStreamable(
                r => PointEvent<SensorReading>.CreateInsert(startTime.AddSeconds(r.Time), r),
                AdvanceTimeSettings.StrictlyIncreasingStartTime);
    }

但是对于上面的示例,除 444 888 之外,有时还会产生 0 (零)。

请建议如何修复此功能。

4 个答案:

答案 0 :(得分:2)

我认为您可以简化数学。让我们创建一个最小乘数和一个最大乘数。

如果minInclusive小于(或等于)multiplier,那么我们知道可以将minMultiplier设置为1。否则,它等于multiplier的下一个倍数,大于minInclusive除以multiplier

maxInclusive始终必须大于(或等于)multiplier,因此我们可以将maxMultiplier设置为maxInclusive / multiplier

然后,我们将multiplier乘以minMultipliermaxMultiplier之间的一个随机数(包括两端):

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    int minMultiplier = minInclusive <= multiplier ? 1 : (int) Math.ceil((double) minInclusive / multiplier);
    int maxMultiplier = maxInclusive / multiplier;
    return multiplier * ThreadLocalRandom.current().nextInt(minMultiplier, maxMultiplier + 1);
}

我已经用许多不同范围的正数进行了测试,它似乎工作得很好。

答案 1 :(得分:0)

0返回Math.random()时,它返回0.0。可以通过以下测试轻松找到

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
        double v =0.0 * (maxInclusive - minInclusive) + minInclusive;
        System.out.println("v = " + v);
        return Math.toIntExact(Math.round(v / multiplier) * multiplier);
    }

@Test
public void test () {
    int t =  getIntegerInRangeMultipleOf(100, 1000, 444);
    System.out.println(t);
}

答案 2 :(得分:0)

如果我们添加一个竞争者来选择Math.random() * (maxInclusive - minInclusive)的添加项,则可以消除0的情况。

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + ( minInclusive < multiplier ? multiplier : minInclusive) ) / multiplier) * multiplier);
}

答案 3 :(得分:0)

不知道如何进行剧本(int),但似乎有用

public static int getIntegerInRangeMultipleOf(int minInclusive,
                                              int maxInclusive,
                                              int multiplier) {
    double random =
            ((Math.random()*(1d - 0.1) + 0.1) * (maxInclusive - minInclusive) + minInclusive) / multiplier;
    if(random < 1) {
        return multiplier;
    } else {
        return (int) Math.floor(random) * multiplier;
    }
}