Guest User

Untitled

a guest
Nov 22nd, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. set = [1, 2, 3, 4, 5, 6]
  2. picked = 0
  3. Function PickNext(set, picked)
  4. If picked > Len(set) - 1 Then
  5. Return Nothing
  6. End If
  7. // random number between picked (inclusive) and length (exclusive)
  8. r = RandomInt(picked, Len(set))
  9. // swap the picked element to the beginning of the set
  10. result = set[r]
  11. set[r] = set[picked]
  12. set[picked] = result
  13. // update picked
  14. picked++
  15. // return your next random element
  16. Return temp
  17. End Function
  18.  
  19. var set = [];
  20. set.picked = 0;
  21. function pickNext(set) {
  22. if(set.picked > set.length - 1) { return null; }
  23. var r = set.picked + Math.floor(Math.random() * (set.length - set.picked));
  24. var result = set[r];
  25. set[r] = set[set.picked];
  26. set[set.picked] = result;
  27. set.picked++;
  28. return result;
  29. }
  30.  
  31. // testing
  32. for(var i=0; i<100; i++) {
  33. set.push(i);
  34. }
  35. while(pickNext(set) !== null) { }
  36. document.body.innerHTML += set.toString();
  37.  
  38. // on the fly set generator
  39. var count = 0;
  40. var maxValue = 64;
  41. function nextElement() {
  42. // restart the generation
  43. if(count == maxValue) {
  44. count = 0;
  45. }
  46. return count++;
  47. }
  48.  
  49. // code to pseudo randomly select elements
  50. var current = 0;
  51. var stack = [0, maxValue - 1];
  52. function randomBinaryWalk() {
  53. if(stack.length == 0) { return null; }
  54. var high = stack.pop();
  55. var low = stack.pop();
  56. var mid = ((high + low) / 2) | 0;
  57. // pseudo randomly choose the next path
  58. if(Math.random() > 0.5) {
  59. if(low <= mid - 1) {
  60. stack.push(low);
  61. stack.push(mid - 1);
  62. }
  63. if(mid + 1 <= high) {
  64. stack.push(mid + 1);
  65. stack.push(high);
  66. }
  67. } else {
  68. if(mid + 1 <= high) {
  69. stack.push(mid + 1);
  70. stack.push(high);
  71. }
  72. if(low <= mid - 1) {
  73. stack.push(low);
  74. stack.push(mid - 1);
  75. }
  76. }
  77. // how many elements to skip
  78. var toMid = (current < mid ? mid - current : (maxValue - current) + mid);
  79. // skip elements
  80. for(var i = 0; i < toMid - 1; i++) {
  81. nextElement();
  82. }
  83. current = mid;
  84. // get result
  85. return nextElement();
  86. }
  87.  
  88. // test
  89. var result;
  90. var list = [];
  91. do {
  92. result = randomBinaryWalk();
  93. list.push(result);
  94. } while(result !== null);
  95. document.body.innerHTML += '<br/>' + list.toString();
  96.  
  97. package main
  98.  
  99. import (
  100. "fmt"
  101. "github.com/bwesterb/powercycle"
  102. )
  103.  
  104. func main() {
  105. var x uint64
  106. cycle := powercycle.New(10)
  107. for i := 0; i < 10; i++ {
  108. fmt.Println(x)
  109. x = cycle.Apply(x)
  110. }
  111. }
  112.  
  113. 0
  114. 6
  115. 4
  116. 1
  117. 2
  118. 9
  119. 3
  120. 5
  121. 8
  122. 7
  123.  
  124. BenchmarkNew10-8 1000000 1328 ns/op
  125. BenchmarkNew1000-8 500000 2566 ns/op
  126. BenchmarkNew1000000-8 50000 25893 ns/op
  127. BenchmarkNew1000000000-8 200000 7589 ns/op
  128. BenchmarkNew1000000000000-8 2000 648785 ns/op
  129. BenchmarkApply10-8 10000000 170 ns/op
  130. BenchmarkApply1000-8 10000000 173 ns/op
  131. BenchmarkApply1000000-8 10000000 172 ns/op
  132. BenchmarkApply1000000000-8 10000000 169 ns/op
  133. BenchmarkApply1000000000000-8 10000000 201 ns/op
  134. BenchmarkApply1000000000000000-8 10000000 204 ns/op
Add Comment
Please, Sign In to add comment