Упрощенная библиотека псевдо-рандома для сервера ла2, построенная на основе Math.random(). Обязательна к установке, если возникают задержки получения результатов случайных операций; если на сервере используется большое количество калькуляций рандома (например использование фантомов); если шансы умений не соответствуют реальности; если просто хотите оптимизации.
+ Сокращает нагрузку на процессор, по сравнению с RandomGenerator
+ Гораздо меньшая и на много более правильная зависимость от...
Перезалил в zip
Поспорил бы с этим утверждением, но мне пока лень писать бенчмарки, так что просто поверьте на слово.Чтобы получить тру рандом можете в коде заменить Math.random() на ThreadLocalRandom.current().nextDouble() но это будет более затратно по производительности.
Benchmark Mode Samples Score Score error Units
j.SingleThreadRndBenchmark.apacheMersenneTwisterRandom avgt 20 4,791 0,164 ns/op
j.SingleThreadRndBenchmark.coltMersenneTwisterRandom avgt 20 3,373 0,041 ns/op
j.SingleThreadRndBenchmark.oldRandom avgt 20 8,598 0,070 ns/op
j.SingleThreadRndBenchmark.threadLocalRandom avgt 20 1,734 0,054 ns/op
Benchmark Mode Samples Score Score error Units
j.MultiThreadRndBenchmark.apacheMersenneTwisterRandom avgt 20 57,296 1,888 ns/op
j.MultiThreadRndBenchmark.coltMersenneTwisterRandom avgt 20 49,314 0,301 ns/op
j.MultiThreadRndBenchmark.oldRandom avgt 20 45,541 0,466 ns/op
j.MultiThreadRndBenchmark.threadLocalRandom avgt 20 13,690 0,133 ns/op
import org.apache.commons.math3.random.MersenneTwister;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class SingleThreadRndBenchmark
{
private static final Random oldRandom = new Random();
private static final MersenneTwister apacheMersenneTwisterRandom = new MersenneTwister();
private static final cern.jet.random.engine.MersenneTwister coltMersenneTwisterRandom = new cern.jet.random.engine.MersenneTwister();
@Benchmark
public void threadLocalRandom(Blackhole bh)
{
int nextInt = ThreadLocalRandom.current().nextInt();
bh.consume(nextInt);
}
@Benchmark
public void oldRandom(Blackhole bh)
{
int nextInt = oldRandom.nextInt();
bh.consume(nextInt);
}
@Benchmark
public void apacheMersenneTwisterRandom(Blackhole bh)
{
int nextInt = apacheMersenneTwisterRandom.nextInt();
bh.consume(nextInt);
}
@Benchmark
public void coltMersenneTwisterRandom(Blackhole bh)
{
int nextInt = coltMersenneTwisterRandom.nextInt();
bh.consume(nextInt);
}
public static void main(String[] args) throws RunnerException
{
Options opt = new OptionsBuilder()
.include(SingleThreadRndBenchmark.class.getSimpleName())
.warmupIterations(20)
.measurementIterations(20)
.result("result2.txt")
.resultFormat(ResultFormatType.TEXT)
.output("log2.txt")
.build();
new Runner(opt).run();
}
}
import org.apache.commons.math3.random.MersenneTwister;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MultiThreadRndBenchmark
{
private static final ThreadLocal<Random> oldRandom = new ThreadLocal<>().withInitial(Random::new);
private static final ThreadLocal<MersenneTwister> apacheMersenneTwisterRandom
= new ThreadLocal<>().withInitial(MersenneTwister::new);
private static final ThreadLocal<cern.jet.random.engine.MersenneTwister> coltMersenneTwisterRandom
= new ThreadLocal<>().withInitial(cern.jet.random.engine.MersenneTwister::new);
@Benchmark
public void threadLocalRandom(Blackhole bh)
{
int nextInt = ThreadLocalRandom.current().nextInt();
bh.consume(nextInt);
}
@Benchmark
public void oldRandom(Blackhole bh)
{
int nextInt = oldRandom.get().nextInt();
bh.consume(nextInt);
}
@Benchmark
public void apacheMersenneTwisterRandom(Blackhole bh)
{
int nextInt = apacheMersenneTwisterRandom.get().nextInt();
bh.consume(nextInt);
}
@Benchmark
public void coltMersenneTwisterRandom(Blackhole bh)
{
int nextInt = coltMersenneTwisterRandom.get().nextInt();
bh.consume(nextInt);
}
public static void main(String[] args) throws RunnerException
{
Options opt = new OptionsBuilder()
.include(MultiThreadRndBenchmark.class.getSimpleName())
.warmupIterations(20)
.measurementIterations(20)
.threads(Runtime.getRuntime().availableProcessors() * 4)
.forks(1)
.result("result1.txt")
.resultFormat(ResultFormatType.TEXT)
.output("log1.txt")
.build();
new Runner(opt).run();
}
}
Нет! Ты не заставишь меня! Никогда!!используйте всегда ThreadLocalRandom и не ебите мозг.
Ну как бы в топике и шла речь исключительно о псевдо рандоме, что я многократно подчеркивал, так же это написано в документации к каждому из представленных рандомайзеров. Под "тру" шансами я имел ввиду лучшие, чем были, что, кстати, не подтвердилось тестами.TC-у:
Надеюсь Вы понимаете разницу между псевдослучайными величинами и случайными величинами....
ИМХО: говоря о том, что Ваш рандом покажет "ТРУ" шансы - вы сильно ошибаетесь. Он ничем не лучше. Ибо он тоже ПСЕВДО случайный... На хабре есть много интересных статей по поводу псевдослучайных и случайных величин.
А вот удобнее ли Ваш рандом? Это уже другой вопрос.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?