diff --git a/src/js/utilJS.tw b/src/js/utilJS.tw
index 18549d4aa775c47dcff17da733c7cbd37892327b..7fe7ed1251cc23abcdb232709428abe66539193d 100644
--- a/src/js/utilJS.tw
+++ b/src/js/utilJS.tw
@@ -144,13 +144,6 @@ window.Height = (function(){
 		return table[nationality + "." + race] || table[nationality] || table["." + race] || table[""] || def;
 	};
 
-	// Helper method - generate two independent Gaussian numbers using Box-Muller transform
-	const gaussianPair = function() {
-		let r = Math.sqrt(-2.0 * Math.log(1 - Math.random()));
-		let sigma = 2.0 * Math.PI * (1 - Math.random());
-		return [r * Math.cos(sigma), r * Math.sin(sigma)];
-	};
-
 	// Helper method: Generate a skewed normal random variable with the skew s
 	// Reference: http://azzalini.stat.unipd.it/SN/faq-r.html
 	const skewedGaussian = function(s) {
@@ -290,6 +283,96 @@ window.Height = (function(){
 	};
 })();
 
+window.Intelligence = (function(){
+	'use strict';
+
+	// Global configuration (for different game modes/options/types)
+	var mean = 0;
+	var minMult = -3.0;
+	var maxMult = 3.0;
+	var skew = 0.0;
+	var spread = 45;
+	var minIntelligence = -101;
+	var maxIntelligence = 100;
+
+	// Configuration method for the above values
+	const _config = function(conf) {
+		if(_.isUndefined(conf)) {
+			return {mean: mean, limitMult: [minMult, maxMult], limitIntelligence: [minIntelligence, maxIntelligence], skew: skew, spread: spread};
+		}
+		if(_.isFinite(conf.mean)) { mean = Math.clamp(conf.mean, -100, 100); }
+		if(_.isFinite(conf.skew)) { skew = Math.clamp(conf.skew, -1000, 1000); }
+		if(_.isFinite(conf.spread)) { spread = Math.clamp(conf.spread, 0.1, 100); }
+		if(_.isArray(conf.limitMult) && conf.limitMult.length === 2 && conf.limitMult[0] !== conf.limitMult[1] &&
+			_.isFinite(conf.limitMult[0]) && _.isFinite(conf.limitMult[1])) {
+			minMult = Math.min(conf.limitMult[0], conf.limitMult[1]);
+			maxMult = Math.max(conf.limitMult[0], conf.limitMult[1]);
+		}
+		if(_.isArray(conf.limitIntelligence) && conf.limitIntelligence.length === 2 && conf.limitIntelligence[0] !== conf.limitIntelligence[1] &&
+			_.isFinite(conf.limitIntelligence[0]) && _.isFinite(conf.limitIntelligence[1])) {
+			minIntelligence = Math.min(conf.limitIntelligence[0], conf.limitIntelligence[1]);
+			maxIntelligence = Math.max(conf.limitIntelligence[0], conf.limitIntelligence[1]);
+		}
+		return {limitMult: [minMult, maxMult], limitIntelligence: [minIntelligence, maxIntelligence], skew: skew, spread: spread};
+	};
+
+	// Helper method: Generate a skewed normal random variable with the skew s
+	// Reference: http://azzalini.stat.unipd.it/SN/faq-r.html
+	const skewedGaussian = function(s) {
+		let randoms = gaussianPair();
+		if(s === 0) {
+			// Don't bother, return an unskewed normal distribution
+			return randoms[0];
+		}
+		let delta = s / Math.sqrt(1 + s * s);
+		let result = delta * randoms[0] + Math.sqrt(1 - delta * delta) * randoms[1];
+		return randoms[0] >= 0 ? result : -result;
+	};
+
+	// Height multiplier generator; skewed gaussian according to global parameters
+	const multGenerator = function() {
+		let result = skewedGaussian(skew);
+		while(result < minMult || result > maxMult) {
+			result = skewedGaussian(skew);
+		}
+		return result;
+	};
+
+	// Helper method: Generate an intelligence based on the mean one and limited according to config.
+	const intelligenceGenerator = function() {
+		let result = multGenerator() * spread + mean;
+
+		while(result < minIntelligence || result > maxIntelligence) {
+			result = multGenerator() * spread + mean;
+		}
+		
+		return Math.ceil(result);
+	};
+
+	const _randomIntelligence = function(settings) {
+	if (settings) {
+		const currentConfig = _config();
+		_config(settings);
+		const result = intelligenceGenerator();
+		_config(currentConfig);
+		return result;
+	}
+	return intelligenceGenerator();
+	};
+
+	return {
+		random: _randomIntelligence,
+		config: _config,
+	};
+})();
+
+// Helper method - generate two independent Gaussian numbers using Box-Muller transform
+window.gaussianPair = function() {
+	let r = Math.sqrt(-2.0 * Math.log(1 - Math.random()));
+	let sigma = 2.0 * Math.PI * (1 - Math.random());
+	return [r * Math.cos(sigma), r * Math.sin(sigma)];
+};
+
 if(!Array.prototype.findIndex) {
 	Array.prototype.findIndex = function(predicate) {
 		if (this == null) {
diff --git a/src/uncategorized/generateXXSlave.tw b/src/uncategorized/generateXXSlave.tw
index d37a79497c00794e3943ac0a7773329d0acc25aa..8024fbb9225d3f971dc31c26bb4e92163101afc2 100644
--- a/src/uncategorized/generateXXSlave.tw
+++ b/src/uncategorized/generateXXSlave.tw
@@ -27,10 +27,11 @@
 <<set $activeSlave.ID = $IDNumber++>>
 <<set $activeSlave.weekAcquired = $week>>
 
-<<set $activeSlave.intelligence = random(-100,100)>>
-<<if random(10,110) < $activeSlave.intelligence>>
+<<set _gaussianPair = gaussianPair()>>
+<<set $activeSlave.intelligence = Intelligence.random()>>
+<<if _gaussianPair[0] < _gaussianPair[1] + $activeSlave.intelligence/29 - 0.35>> /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
 	<<set $activeSlave.intelligenceImplant = 15>>
-	<<if random(50,150) < $activeSlave.intelligence>>
+	<<if random(15,150) < $activeSlave.intelligence>>
 		<<set $activeSlave.intelligenceImplant = 30>>
 	<</if>>
 <</if>>
diff --git a/src/uncategorized/generateXYSlave.tw b/src/uncategorized/generateXYSlave.tw
index c2399f4df28102ef729973152c03ba0ed12822e9..814b177681ccb45a5e129ed830bbe240aaf60e0e 100644
--- a/src/uncategorized/generateXYSlave.tw
+++ b/src/uncategorized/generateXYSlave.tw
@@ -26,10 +26,11 @@
 <<set $activeSlave.ID = $IDNumber++>>
 <<set $activeSlave.weekAcquired = $week>>
 
-<<set $activeSlave.intelligence = random(-100,100)>>
-<<if random(10,110) < $activeSlave.intelligence>>
+<<set _gaussianPair = gaussianPair()>>
+<<set $activeSlave.intelligence = Intelligence.random()>>
+<<if _gaussianPair[0] < _gaussianPair[1] + $activeSlave.intelligence/29 - 0.35>> /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
 	<<set $activeSlave.intelligenceImplant = 15>>
-	<<if random(50,150) < $activeSlave.intelligence>>
+	<<if random(15,150) < $activeSlave.intelligence>>
 		<<set $activeSlave.intelligenceImplant = 30>>
 	<</if>>
 <</if>>
diff --git a/src/uncategorized/lawCompliance.tw b/src/uncategorized/lawCompliance.tw
index 92d39f7091c3408b3956fd014d5c66e1ee1cce5e..d0a0acbb6659130729177be7f6a638557989eec0 100644
--- a/src/uncategorized/lawCompliance.tw
+++ b/src/uncategorized/lawCompliance.tw
@@ -410,7 +410,7 @@
 
 <<if $BasicIntelligenceSMR == 1>>
 	<<if $activeSlave.intelligence <= -15>>
-		<<set $activeSlave.intelligence = random(0,40)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,40]})>>
 	<</if>>
 	While she was in the slave pens, she saw that less intelligent slaves were immediately designated as menials and fuckdolls, and she is @@.gold;terrified@@ that if she makes a mistake, she'll be thought stupid and be reassigned on the spot.
 	<<set $activeSlave.trust -= 5>>
@@ -418,7 +418,7 @@
 
 <<if $QualityIntelligenceSMR == 1>>
 	<<if $activeSlave.intelligence <= 15>>
-		<<set $activeSlave.intelligence = random(16,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [16,100]})>>
 	<</if>>
 	While she was in the slave pens, she saw that less intelligent slaves were immediately designated as menials and fuckdolls, and she is @@.gold;terrified@@ that if she makes a mistake, she'll be thought stupid and be reassigned on the spot.
 	<<set $activeSlave.trust -= 5>>
diff --git a/src/uncategorized/seRecruiterSuccess.tw b/src/uncategorized/seRecruiterSuccess.tw
index d9fa1a9824ddcdc68c00b2bdd86485a522bd61cd..f74bac5fed5bd4d5f01df97bc3ea19c3464c87ee 100644
--- a/src/uncategorized/seRecruiterSuccess.tw
+++ b/src/uncategorized/seRecruiterSuccess.tw
@@ -19,7 +19,7 @@
 <<set $activeSlave.analSkill = 0>>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
@@ -51,7 +51,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced a starving yo
 <<set $activeSlave.analSkill = 0>>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
@@ -78,7 +78,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced a recent divo
 <</if>>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
@@ -122,7 +122,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an old world
 <<set $activeSlave.sexualFlaw = "hates women">>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
@@ -156,7 +156,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an old world
 <<set $activeSlave.weight = random(0,50)>>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
@@ -203,7 +203,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an unhealthy
 <<set $activeSlave.clitPiercing = random(0,1)>>
 <<if $recruiterEugenics == 1>>
 	<<if $IntelligenceEugenicsSMR == 1>>
-		<<set $activeSlave.intelligence = random(40,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>>
 	<</if>>
 	<<if $HeightEugenicsSMR == 1>>
 		<<set $activeSlave.height = random(185,190)>>
diff --git a/src/utility/slaveCreationWidgets.tw b/src/utility/slaveCreationWidgets.tw
index 53c550bf7a4d459b92847fb5991bc61e73dd94c7..cc350a230fe3241a721b4aba8d1e5b6037869b79 100644
--- a/src/utility/slaveCreationWidgets.tw
+++ b/src/utility/slaveCreationWidgets.tw
@@ -1905,10 +1905,10 @@
 	<</if>>
 	<<if $entrapmentUpgradeIntelligence == "intelligent">>
 		Intelligent slaves have a high priority for training.
-		<<set $activeSlave.intelligence = random(30,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [30,100]})>>
 	<<elseif $entrapmentUpgradeIntelligence == "stupid">>
 		Stupid slaves have a high priority for training.
-		<<set $activeSlave.intelligence = random(-100,-30)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100,-30]})>>
 	<<else>>
 		Slaves' intelligence is not given special consideration.
 	<</if>>
@@ -2687,7 +2687,7 @@
 	<<set $activeSlave.devotion = 0>>
 	<<set $activeSlave.trust = 0>>
 	<<set $activeSlave.career = "a slave">>
-	<<set $activeSlave.intelligence = random(-100,0)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100,0]})>>
 	<<set $activeSlave.intelligenceImplant = 0>>
 	<<set $activeSlave.health = random(-99,0)>>
 	<<set $activeSlave.weight = random(-100,0)>>
@@ -2740,7 +2740,7 @@
 	<<set $activeSlave.devotion = 40>>
 	<<set $activeSlave.trust = -100>>
 	<<set $activeSlave.career = either("a politician", "a college scout", "a business owner", "a house DJ", "a soldier", "a prison guard", "a doctor", "a counselor", "a dairy worker", "a secretary", "a teacher")>>
-	<<set $activeSlave.intelligence = either(20,100)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [20,100]})>>
 	<<set $activeSlave.intelligenceImplant = 30>>
 	<<set $activeSlave.health = random(-99,-50)>>
 	<<set $activeSlave.weight = random(-100,-50)>>
@@ -2820,7 +2820,7 @@
 	<<set $activeSlave.origin = "You bought her from the kidnappers' slave market, so she was probably forced into slavery.">>
 	<<set $activeSlave.devotion -= 5>>
 	<<set $activeSlave.trust = random(-45,-25)>>
-	<<set $activeSlave.intelligence = either(-90,45)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-90,45]})>>
 	<<set $activeSlave.health = random(-80,20)>>
 	<<if $activeSlave.vagina > 1 && isFertile($activeSlave)>>
 		<<set $activeSlave.preg = either(-2, -1, -1, -1, -1, -1, -1, -1, 1, 20, 40)>>
@@ -2855,7 +2855,7 @@
 	<<set $activeSlave.origin = "You bought her from the runaway hunters' slave market after they recaptured her and her original owner did not pay their fee.">>
 	<<set $activeSlave.devotion = -20>>
 	<<set $activeSlave.trust = random(-15,15)>>
-	<<set $activeSlave.intelligence = random(0,100)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,100]})>>
 	<<set $activeSlave.intelligenceImplant = 15>>
 	<<if $activeSlave.physicalAge >= 12>>
 		<<set $activeSlave.teeth = "normal">>
@@ -3025,7 +3025,7 @@
 	<<if $activeSlave.physicalAge >= 12>>
 		<<set $activeSlave.teeth = "normal">>
 	<</if>>
-	<<set $activeSlave.intelligence = random(-20,70)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20,70]})>>
 	<<set $activeSlave.devotion = random(25,45)>>
 	<<set $activeSlave.trust = random(25,45)>>
 	<<set $activeSlave.health = random(50,60)>>
@@ -3120,7 +3120,7 @@
 	<<else>>
 		<<set $activeSlave.intelligenceImplant = 15>>
 		<<set $activeSlave.teeth = "normal">>
-		<<set $activeSlave.intelligence = random(-30,60)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-30,60]})>>
 		<<set $activeSlave.devotion = random(25,45)>>
 		<<set $activeSlave.trust = random(25,45)>>
 	<</if>>
@@ -3248,7 +3248,7 @@
 	<<set $activeSlave.career = "a slave">>
 	<<set $activeSlave.intelligenceImplant = 30>>
 	<<set $activeSlave.teeth = "normal">>
-	<<set $activeSlave.intelligence = random(-20,60)>>
+	<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20,60]})>>
 	<<set $activeSlave.chem = 20>>
 	<<if $TGA.schoolUpgrade == 1>>
 		<<set $activeSlave.devotion = 100>>
@@ -3695,7 +3695,7 @@
 		<<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [2, 15], spread: .1}),_minHeight, 274))>>
 		<<set $activeSlave.muscles = random(40,80)>>
 	<<else>>
-		<<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [3, 9]}),_minHeight, 274))>>
+		<<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [1, 4]}),_minHeight, 274))>>
 		<<set $activeSlave.muscles = random(20,40)>>
 	<</if>>
 	<<if $HA.schoolUpgrade == 3>>
@@ -3707,7 +3707,7 @@
 	<</if>>
 	<<set $activeSlave.shoulders = 0>>
 	<<if $HA.schoolUpgrade == 1>>
-		<<set $activeSlave.intelligence = random(20,70)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [20,70]})>>
 		<<set $activeSlave.vaginalSkill = either(20,20,40)>>
 		<<set $activeSlave.oralSkill = either(20,20,40)>>
 		<<set $activeSlave.analSkill = either(20,20,40)>>
@@ -4424,7 +4424,7 @@
 		<<set $activeSlave.trust = random(0,60)>>
 		<<set $activeSlave.hStyle = "buzzcut">>
 		<<set $activeSlave.hLength = 0>>
-		<<set $activeSlave.intelligence = random(0,100)>>
+		<<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,100]})>>
 		<<set $activeSlave.health = random(0,60)>>
 	<<case "rape">>
 		<<set $activeSlave.origin = "You purchased her life at a prison sale. She was locked away for rape.">>