package builtin.random; import builtin.BuiltinSub; import builtin.web.GetWebsiteContents; import java.util.Random; import gui.Heap; import gui.MintException; import gui.Pointer; import gui.SmartList; /** * Returns a random integer based off of information gathered from the * Internet. * An Internet connection is not required, but helps randomness * considerably. * This is a very slow built-in subprogram. Expect around 1 second of * delay before it returns. That's the price for true randomness. * @author Oliver Chu */ public class TrueRandomInt extends BuiltinSub { @Override public Pointer apply(SmartList<Pointer> args) throws MintException { RandomInt.setRandomNumberGenerator(); String reddit = GetWebsiteContents.getUrlSource("http://www.reddit.com", 0); String nsfw = GetWebsiteContents.getUrlSource( "http://gelbooru.com/index.php?page=post&s=list", 0); String husky = GetWebsiteContents.getUrlSource( "http://www.youtube.com/user/HuskyStarcraft/videos?view=0", 0); int trulyRandomInteger = husky.length() + nsfw.length() + reddit.length(); trulyRandomInteger = ((Long) System.nanoTime()).hashCode() - trulyRandomInteger; trulyRandomInteger |= husky.hashCode(); trulyRandomInteger *= Math.abs(reddit.hashCode()) % 256; trulyRandomInteger ^= nsfw.hashCode(); Random numGenerator = new Random(); numGenerator.setSeed(System.nanoTime()); double gaussian = Math.abs(numGenerator.nextGaussian()); double someNumber = numGenerator.nextInt(nsfw.length()) * gaussian; int someNum = (int) someNumber; trulyRandomInteger += someNum; trulyRandomInteger ^= (int) (numGenerator.nextLong() + System.currentTimeMillis() & ((Double) numGenerator.nextDouble()).toString().hashCode()); return Heap.allocateInt(trulyRandomInteger); } }