Skip to content

Instantly share code, notes, and snippets.

@JnBrymn
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JnBrymn/8792245 to your computer and use it in GitHub Desktop.
Save JnBrymn/8792245 to your computer and use it in GitHub Desktop.
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