fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.util.stream.*;
  5. import java.util.concurrent.ThreadLocalRandom;
  6.  
  7. class Ideone {
  8. public static void main(String[] args) {
  9.  
  10. Ranges r = new Ranges()
  11. .add(3, 5)
  12. .add(13, 16);
  13.  
  14. Map<Long, Long> map = Stream.generate(() -> r.random())
  15. .limit(1000000)
  16. .collect(Collectors.groupingBy(i -> i, Collectors.counting()));
  17.  
  18. map.forEach((k, v) -> System.out.println(k + ": " + v + "x"));
  19.  
  20. }
  21. }
  22.  
  23. class Ranges {
  24.  
  25. private long offset;
  26. private List<Long> offsets = new ArrayList<>();
  27. private List<Range> ranges = new ArrayList<>();
  28.  
  29. Ranges add(long min, long max) {
  30. this.ranges.add(new Range(min, max));
  31. this.offsets.add(offset);
  32. this.offset += (max - min);
  33. return this;
  34. }
  35.  
  36. long random() {
  37. long index = ThreadLocalRandom.current().nextLong(this.offset);
  38. int offsetIndex = Collections.binarySearch(this.offsets, index);
  39. if (offsetIndex < 0) {
  40. offsetIndex = Math.abs(offsetIndex) - 2;
  41. }
  42. Range r = this.ranges.get(offsetIndex);
  43. return r.lower + index - this.offsets.get(offsetIndex);
  44. }
  45. }
  46.  
  47. class Range {
  48.  
  49. long lower;
  50. long upper;
  51.  
  52. Range(long lower, long upper) {
  53. this.lower = lower;
  54. this.upper = upper;
  55. }
  56. }
Success #stdin #stdout 0.27s 2184192KB
stdin
Standard input is empty
stdout
3: 200516x
4: 199594x
13: 200430x
14: 199675x
15: 199785x