Last active
August 29, 2015 13:56
-
-
Save JnBrymn/8792245 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var crypto = require('crypto'); | |
//varies from -1 t0 1 | |
var pow2_31 = Math.pow(2,31); | |
var randNum = function(t,seed) { | |
var shasum = crypto.createHash('sha1'); | |
return shasum.update(""+seed+t).digest().readUInt32LE(0)/pow2_31-1; | |
} | |
var randNumGenMaker = function(seed) { | |
if(typeof seed === "undefined") {seed = ''} | |
seed += ''; | |
//this can be changed to change to affect the "texture" of the random data. | |
var factors = [1/33,1/32,1/31,1/30,1/29,1/28,1/27,1/26,1/25,1/24,1/23,1/22,1/21,1/20,1/19,1/18,1/17,1/16,1/15,1/14,1/13,1/12,1/11,1/10,1/9,1/8,1/7,1/6,1/5,1/4,1/3,1/2,1/1] | |
var power = 32; | |
var startX = 0; | |
var endX = Math.pow(2,power); | |
var midX = Math.pow(2,power-1); | |
var startY = randNum(startX,seed)*factors[power]; | |
var endY = randNum(endX,seed)*factors[power]; | |
var midY = (endY-startY)/2+randNum(midX,seed)*factors[power-1]; | |
var helper = { | |
power:power, | |
startX:startX, | |
endX:endX, | |
midX:midX, | |
startY:startY, | |
endY:endY, | |
midY:midY, | |
aboveHelper:null, | |
shrinkLeft:function() { | |
var power = this.power-1; | |
var startX = this.startX; | |
var endX = this.midX; | |
var midX = startX+Math.pow(2,power-1); | |
var startY = this.startY; | |
var endY = this.midY; | |
//midY= the midpoint between the start and end Y + some perturbation | |
var midY = (endY+startY)/2+randNum(midX,seed)*factors[power-1]; | |
console.log("\tstartX="+ startX +" midX="+ midX +" endX="+ endX); | |
console.log("\tstartY="+ startY +" midY="+ midY +" endY="+ endY); | |
console.log("\tmidY="+(endY+startY)/2+"+randNum("+midX+",'"+seed+"')*"+factors[power-1]); | |
var helper = { | |
power:power, | |
startX:startX, | |
endX:endX, | |
midX:midX, | |
startY:startY, | |
endY:endY, | |
midY:midY, | |
aboveHelper:this, | |
shrinkLeft:this.shrinkLeft, | |
shrinkRight:this.shrinkRight | |
} | |
return helper | |
}, | |
shrinkRight:function() { | |
var power = this.power-1; | |
var startX = this.midX; | |
var endX = this.endX; | |
var midX = startX+Math.pow(2,power-1); | |
var startY = this.midY; | |
var endY = this.endY; | |
//midY= the midpoint between the start and end Y + some perturbation | |
var midY = (endY+startY)/2+randNum(midX,seed)*factors[power-1]; | |
console.log("\tstartX="+ startX +" midX="+ midX +" endX="+ endX); | |
console.log("\tstartY="+ startY +" midY="+ midY +" endY="+ endY); | |
console.log("\tmidY="+(endY+startY)/2+"+randNum("+midX+",'"+seed+"')*"+factors[power-1]); | |
var helper = { | |
power:power, | |
startX:startX, | |
endX:endX, | |
midX:midX, | |
startY:startY, | |
endY:endY, | |
midY:midY, | |
aboveHelper:this, | |
shrinkLeft:this.shrinkLeft, | |
shrinkRight:this.shrinkRight | |
} | |
return helper | |
} | |
} | |
///////// | |
////THIS WAS REALLY HELPFUL IN DEBUGGING THE HELPER | |
//h=helper | |
//console.log("Making hL") | |
//hL=h.shrinkLeft() | |
//console.log("Making hR") | |
//hR=h.shrinkRight() | |
//console.log("Making hLL") | |
//hLL=hL.shrinkLeft() | |
//console.log("Making hLR") | |
//hLR=hL.shrinkRight() | |
//console.log("Making hRL") | |
//hRL=hR.shrinkLeft() | |
//console.log("Making hRR") | |
//hRR=hR.shrinkRight() | |
//if(hL.endX!=hR.startX) { | |
// console.log("1X") | |
//} | |
//if(hLL.endX!=hLR.startX) { | |
// console.log("2LX") | |
//} | |
//if(hLR.endX!=hRL.startX) { | |
// console.log("2MX") | |
//} | |
//if(hRL.endX!=hRR.startX) { | |
// console.log("2RX") | |
//} | |
//if(hL.endY!=hR.startY) { | |
// console.log("1Y") | |
//} | |
//if(hLL.endY!=hLR.startY) { | |
// console.log("2LY") | |
//} | |
//if(hLR.endY!=hRL.startY) { | |
// console.log("2MY") | |
//} | |
//if(hRL.endY!=hRR.startY) { | |
// console.log("2RY") | |
//} | |
var randNumGen = function(x) { | |
while(true) { | |
console.log("at ["+ helper.startX +","+ helper.endX +"]") | |
if(x==helper.startX) { | |
console.log(" at "+ helper.startX +" found "+ helper.startY) | |
return helper.startY | |
} else if(x>helper.startX && x<helper.midX) { | |
console.log(" shrinking left") | |
helper = helper.shrinkLeft() | |
} else if(x>=helper.midX && x<helper.endX) { | |
console.log(" shrinking right") | |
helper = helper.shrinkRight() | |
} else { | |
console.log(" growing") | |
helper = helper.aboveHelper | |
} | |
} | |
} | |
return randNumGen; | |
} | |
var seriesGenerator = function(start,end,delta,seed) { | |
if(typeof delta === "undefined") { | |
delta = 1 | |
} | |
if(typeof seed === "undefined") {seed = ''} | |
seed += ''; | |
var randNumGen = randNumGenMaker(seed); | |
var series = [] | |
for(var t=start; t<end ; t += delta) { | |
series.push(randNumGen(t)) | |
} | |
return series; | |
} | |
module.exports.seriesGenerator = seriesGenerator |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment