Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- set = [1, 2, 3, 4, 5, 6]
- picked = 0
- Function PickNext(set, picked)
- If picked > Len(set) - 1 Then
- Return Nothing
- End If
- // random number between picked (inclusive) and length (exclusive)
- r = RandomInt(picked, Len(set))
- // swap the picked element to the beginning of the set
- result = set[r]
- set[r] = set[picked]
- set[picked] = result
- // update picked
- picked++
- // return your next random element
- Return temp
- End Function
- var set = [];
- set.picked = 0;
- function pickNext(set) {
- if(set.picked > set.length - 1) { return null; }
- var r = set.picked + Math.floor(Math.random() * (set.length - set.picked));
- var result = set[r];
- set[r] = set[set.picked];
- set[set.picked] = result;
- set.picked++;
- return result;
- }
- // testing
- for(var i=0; i<100; i++) {
- set.push(i);
- }
- while(pickNext(set) !== null) { }
- document.body.innerHTML += set.toString();
- // on the fly set generator
- var count = 0;
- var maxValue = 64;
- function nextElement() {
- // restart the generation
- if(count == maxValue) {
- count = 0;
- }
- return count++;
- }
- // code to pseudo randomly select elements
- var current = 0;
- var stack = [0, maxValue - 1];
- function randomBinaryWalk() {
- if(stack.length == 0) { return null; }
- var high = stack.pop();
- var low = stack.pop();
- var mid = ((high + low) / 2) | 0;
- // pseudo randomly choose the next path
- if(Math.random() > 0.5) {
- if(low <= mid - 1) {
- stack.push(low);
- stack.push(mid - 1);
- }
- if(mid + 1 <= high) {
- stack.push(mid + 1);
- stack.push(high);
- }
- } else {
- if(mid + 1 <= high) {
- stack.push(mid + 1);
- stack.push(high);
- }
- if(low <= mid - 1) {
- stack.push(low);
- stack.push(mid - 1);
- }
- }
- // how many elements to skip
- var toMid = (current < mid ? mid - current : (maxValue - current) + mid);
- // skip elements
- for(var i = 0; i < toMid - 1; i++) {
- nextElement();
- }
- current = mid;
- // get result
- return nextElement();
- }
- // test
- var result;
- var list = [];
- do {
- result = randomBinaryWalk();
- list.push(result);
- } while(result !== null);
- document.body.innerHTML += '<br/>' + list.toString();
- package main
- import (
- "fmt"
- "github.com/bwesterb/powercycle"
- )
- func main() {
- var x uint64
- cycle := powercycle.New(10)
- for i := 0; i < 10; i++ {
- fmt.Println(x)
- x = cycle.Apply(x)
- }
- }
- 0
- 6
- 4
- 1
- 2
- 9
- 3
- 5
- 8
- 7
- BenchmarkNew10-8 1000000 1328 ns/op
- BenchmarkNew1000-8 500000 2566 ns/op
- BenchmarkNew1000000-8 50000 25893 ns/op
- BenchmarkNew1000000000-8 200000 7589 ns/op
- BenchmarkNew1000000000000-8 2000 648785 ns/op
- BenchmarkApply10-8 10000000 170 ns/op
- BenchmarkApply1000-8 10000000 173 ns/op
- BenchmarkApply1000000-8 10000000 172 ns/op
- BenchmarkApply1000000000-8 10000000 169 ns/op
- BenchmarkApply1000000000000-8 10000000 201 ns/op
- BenchmarkApply1000000000000000-8 10000000 204 ns/op
Add Comment
Please, Sign In to add comment