我正在努力完成实用程序方法,以生成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 (零)。
请建议如何修复此功能。
答案 0 :(得分:2)
我认为您可以简化数学。让我们创建一个最小乘数和一个最大乘数。
如果minInclusive
小于(或等于)multiplier
,那么我们知道可以将minMultiplier
设置为1
。否则,它等于multiplier
的下一个倍数,大于minInclusive
除以multiplier
。
maxInclusive
始终必须大于(或等于)multiplier
,因此我们可以将maxMultiplier
设置为maxInclusive / multiplier
。
然后,我们将multiplier
乘以minMultiplier
和maxMultiplier
之间的一个随机数(包括两端):
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;
}
}