A Random Characteristics table

I've been doing some random tables lately to help making life easier south of the GM screen; I've got character concepts, techniques and forms, personality traits, hermetic houses... but I didn't have characteristics, and I thought "let's give it a try".

At some point in the past I did have a random characteristics generator, but it ended being a table with a over a million rows (eight cars, ranging from -5 to +5) and some odd constraints to keep the chars costs being mostly 7, and maybe 10 or 4 (or 13 or 1...) with relevant virtues or flaws and such: not something you want to print on a table anyway.

So I thought about making things simpler by:

  • Limiting the characteristics cost to 7 points. I'm assuming here that Improved / Weak Chars are relatively uncommon, and also can be applied on the fly if desired.
  • Limiting the values to the -3 / +3 range. Also assuming that Great / Poor Char is uncommon and can be improvised if needed.
  • Not assigning a value to each specific characteristic, but returning just a list of the values in descending order. This actually seems a nice thing to have, because the same set of random values could work for the common magus, or king, or craftsmen, or beggar or whatever by flipping the values to fit their most relevant characteristics, sinking the lower values in their less useful ones and all that we do all the time when creating a character anyway.

So I'm going after a lists that looks like {+3, +1, 0, 0, 0, 0, 0}, {+2, +2, +1, 0, 0, 0, 0}, {+2, +2, +2, +1, +1, 0, -1, -2}, and so on. And then I'm trying to figure out a way to get them at random, assigning a higher chance to the least "max-min"-ed ones (this is, I'm trying to make {+3, +3, +3, +3, +1, -3, -3, -3} something that rarely happens).

Starting with the list of possible combinations, it turns out that there are just 71 of them! Which was actually something quite surprising for me.

I didn't know where even to start to model that as a combinatory problem with the cost restrictions (though I'd be dying to see it if anybody can come up with that), so what I did was to brute-force it asking my dear MySQL database to just get the number (I like to think I treat that server as mercifully as any Tytalus master would treat his apprentice), by saying "Get me eight numbers from -3 to +3, each one being smaller than the other, and with the triangular value of each one adding up a total of 7". I'd add the code in a reply below in case anyone is interested, wants to play with it or sees a blatant error on it.

Now I think that list is interesting because 75% of the combinations have on characteristic (at least) at +3, and a 41% of them have a characteristic at -3. As I said above I'd love to see these possibilities as more uncommon, to have characters with a more normalised values around 0's, but there are only 13 rows with a higher value up to +2 and a lower one down to -2. So I added some weighting values to each row, modifying its frequency so for example only 0.5% of the randomly generated players can get that hideous {+3, +3, +3, +3, +1, -3, -3, -3} combination, but a 4% of them will get a {+2, +2, +1, +1, +1, +1, 0, -2}. These were put also to make it possible for everything to sum up to a value I could roll on a D1000.

So I got this.

Roll {Characteristic values} Freq.
001-040 {+1, +1, +1, +1, +1, +1, +1, 0} 4,0%
041-080 {+2, +1, +1, +1, +1, 0, 0, 0} 4,0%
081-120 {+2, +1, +1, +1, +1, +1, 0, -1} 4,0%
121-160 {+2, +2, +1, 0, 0, 0, 0, 0} 4,0%
161-200 {+2, +2, +1, +1, 0, 0, 0, -1} 4,0%
201-240 {+2, +2, +1, +1, +1, 0, -1, -1} 4,0%
241-280 {+2, +2, +1, +1, +1, +1, 0, -2} 4,0%
281-315 {+2, +2, +2, 0, 0, 0, -1, -1} 3,5%
316-350 {+2, +2, +2, +1, 0, -1, -1, -1} 3,5%
351-385 {+2, +2, +2, +1, 0, 0, 0, -2} 3,5%
386-420 {+2, +2, +2, +1, +1, 0, -1, -2} 3,5%
421-440 {+2, +2, +2, +1, +1, +1, +1, -3} 2,0%
441-475 {+2, +2, +2, +2, 0, -1, -1, -2} 3,5%
476-510 {+2, +2, +2, +2, +1, 0, -2, -2} 3,5%
511-530 {+2, +2, +2, +2, +1, 0, 0, -3} 2,0%
531-550 {+2, +2, +2, +2, +1, +1, -1, -3} 2,0%
551-570 {+2, +2, +2, +2, +2, -1, -1, -3} 2,0%
571-590 {+2, +2, +2, +2, +2, +1, -2, -3} 2,0%
591-600 {+3, +1, 0, 0, 0, 0, 0, 0} 1,0%
601-610 {+3, +1, +1, 0, 0, 0, 0, -1} 1,0%
611-620 {+3, +1, +1, +1, 0, 0, -1, -1} 1,0%
621-630 {+3, +1, +1, +1, +1, -1, -1, -1} 1,0%
631-640 {+3, +1, +1, +1, +1, 0, 0, -2} 1,0%
641-650 {+3, +1, +1, +1, +1, +1, -1, -2} 1,0%
651-660 {+3, +2, 0, 0, 0, 0, -1, -1} 1,0%
661-670 {+3, +2, +1, 0, 0, -1, -1, -1} 1,0%
671-680 {+3, +2, +1, 0, 0, 0, 0, -2} 1,0%
681-690 {+3, +2, +1, +1, -1, -1, -1, -1} 1,0%
691-700 {+3, +2, +1, +1, 0, 0, -1, -2} 1,0%
701-710 {+3, +2, +1, +1, +1, -1, -1, -2} 1,0%
711-720 {+3, +2, +1, +1, +1, +1, -2, -2} 1,0%
721-725 {+3, +2, +1, +1, +1, +1, 0, -3} 0,5%
726-735 {+3, +2, +2, -1, -1, -1, -1, -1} 1,0%
736-745 {+3, +2, +2, 0, 0, -1, -1, -2} 1,0%
746-755 {+3, +2, +2, +1, -1, -1, -1, -2} 1,0%
756-765 {+3, +2, +2, +1, 0, 0, -2, -2} 1,0%
766-770 {+3, +2, +2, +1, 0, 0, 0, -3} 0,5%
771-780 {+3, +2, +2, +1, +1, -1, -2, -2} 1,0%
781-785 {+3, +2, +2, +1, +1, 0, -1, -3} 0,5%
786-795 {+3, +2, +2, +2, -1, -1, -2, -2} 1,0%
796-800 {+3, +2, +2, +2, 0, -1, -1, -3} 0,5%
801-810 {+3, +2, +2, +2, +1, -2, -2, -2} 1,0%
811-815 {+3, +2, +2, +2, +1, 0, -2, -3} 0,5%
816-820 {+3, +2, +2, +2, +2, +1, -3, -3} 0,5%
821-830 {+3, +3, 0, -1, -1, -1, -1, -1} 1,0%
831-840 {+3, +3, 0, 0, 0, -1, -1, -2} 1,0%
841-850 {+3, +3, +1, 0, -1, -1, -1, -2} 1,0%
851-860 {+3, +3, +1, 0, 0, 0, -2, -2} 1,0%
861-865 {+3, +3, +1, 0, 0, 0, 0, -3} 0,5%
866-875 {+3, +3, +1, +1, 0, -1, -2, -2} 1,0%
876-880 {+3, +3, +1, +1, 0, 0, -1, -3} 0,5%
881-885 {+3, +3, +1, +1, +1, -1, -1, -3} 0,5%
886-890 {+3, +3, +1, +1, +1, +1, -2, -3} 0,5%
891-900 {+3, +3, +2, 0, -1, -1, -2, -2} 1,0%
901-905 {+3, +3, +2, 0, 0, -1, -1, -3} 0,5%
906-910 {+3, +3, +2, +1, -1, -1, -1, -3} 0,5%
911-920 {+3, +3, +2, +1, 0, -2, -2, -2} 1,0%
921-925 {+3, +3, +2, +1, 0, 0, -2, -3} 0,5%
926-930 {+3, +3, +2, +1, +1, -1, -2, -3} 0,5%
931-935 {+3, +3, +2, +2, -1, -1, -2, -3} 0,5%
936-940 {+3, +3, +2, +2, +1, -2, -2, -3} 0,5%
941-945 {+3, +3, +2, +2, +1, 0, -3, -3} 0,5%
946-955 {+3, +3, +3, -1, -1, -2, -2, -2} 1,0%
956-960 {+3, +3, +3, 0, -1, -1, -2, -3} 0,5%
961-970 {+3, +3, +3, +1, -2, -2, -2, -2} 1,0%
971-975 {+3, +3, +3, +1, 0, -2, -2, -3} 0,5%
976-980 {+3, +3, +3, +1, 0, 0, -3, -3} 0,5%
981-985 {+3, +3, +3, +1, +1, -1, -3, -3} 0,5%
986-990 {+3, +3, +3, +2, -1, -1, -3, -3} 0,5%
991-995 {+3, +3, +3, +2, +1, -2, -3, -3} 0,5%
996-000 {+3, +3, +3, +3, +1, -3, -3, -3} 0,5%

And I thought about sharing, in case anyone is interested on it.

4 Likes

And the SQL code to get the numbers was this one:

with cte_s as 
(select 
	n as score,
	(n) * (1 + abs(n)) / 2 as cost
from 
	(select -3 as n union select -2 union select -1 union select 0 union select 1 union select 2 union select 3)
)
select
	s1.score, 
	s2.score,
	s3.score,
	s4.score,
	s5.score,
	s6.score,
	s7.score,
	s8.score,
	s1.cost + s2.cost + s3.cost + s4.cost + s5.cost + s6.cost + s7.cost + s8.cost as total_cost
from 
	cte_s as s1
	join cte_s as s2
		on s2.score <= s1.score
	join cte_s as s3
		on s3.score <= s2.score
	join cte_s as s4
		on s4.score <= s3.score
	join cte_s as s5
		on s5.score <= s4.score
	join cte_s as s6
		on s6.score <= s5.score
	join cte_s as s7
		on s7.score <= s6.score
	join cte_s as s8
		on s8.score <= s7.score
where
	s1.cost + s2.cost + s3.cost + s4.cost + s5.cost + s6.cost + s7.cost + s8.cost = 7;
2 Likes

As a sidenote, @dc444 wrote here What happens to all the Gifted children with low Int? that the average char score would be slightly below 1 (and I think it was that comment the one that made me think about getting this random table); with that table above, the average char score is 0.57.

3 Likes

Yeah, when I said that I was just thinking that the “closest to average” stats you could come up with under this system netting +7 points was 7 @ +1 and 1 @ 0. So the making the average +7/8ths but that doesn’t take into account the increasing costs of higher values.

1 Like

Also @Ouroboros , was gonna message you about getting those other tables you’ve created but it doesn’t seem possible to direct message you since your profile is hidden.

Mine or all of them? I think I tried to pm someone a while ago and I couldn't, so maybe they changed the setting. I'll try anyway.

I'd love to share these tables, though many of them are bounty for other sites and I didn't save the source (so it is unpolite to share). The main issue anyway is that all of them are in spanish. I'd see what I can do.

Thanks for posting @Ouroboros.

How about just rolling 1d6-1d6 for each stat? Or d4s if you don't want the extremes. Yes they would not be balanced, but they are NPCs so why should they?

How about II. I like to think of the stats in terms of standard deviations, that is for the population, rather than for generated characters. Zero mean. +1 is one standard deviation, so two thirds are within ±1, 95% within ±2 and 98% within ±3. For each stat. Of course, it works much better with continuous numbers so there is some thinking needed to discretise it. The point is that this gives a scale and a distribution which is meaningful and familiar.

and to thing I was just using the excel code of =max(randbetween(1,6),randbetween(1,6))-randbetween(1,6) which generally seems to produce a decent distribution, if a bit high, though the weighting can be fine tuned on either side..

Yeah, that's how I like to think about characteristics as well. It just doesn't follow the character creation rules. That's not an issue per se, but most NPCs in raw follow the 7 characteristic points rule, which I see as a way to say "ok, the random guy gets an average of 0 with a std. dev. of 1, but anyone deserving consideration gets the 7 points". Which ends with any NPC created following that rule. Also trying to follow it is fun.

Well, one of the nerdiest things I like about Ars is that it only uses D10s. So these are the only dice I buy (and use). But I actually have something to get these values from -3 to +3 (and scores from 0 to 6 in case you need to improvise a score. And then I combine them, for example a magus challenges you to Certamen, then I can roll three times on the 0-6 range and add them to get an Art. I do that 4 times and I take the two bigger numbers as his primary Arts and the lowers as the secondary) for stuff like Personality Traits (and before that table for characteristics as well), considering the percentages of what you get when you add 2D10:

2d10 2-4 5-7 8-9 10-12 13-14 15-17 18-20
p 6% 15% 15% 28% 15% 15% 6%
–3 : +3 –3 –2 –1 0 +1 +2 +3
0 : 6 0 +1 +2 +3 +4 +5 +6

Hey no shame there, I also use Excel. I'm just trying to quit doing it, because no matter how useful it is, it's not as fun as rolling a dice on a table. Also I spend enough time already working on my laptop to have it also on the table.

I have another way to get the random numbers in excel, anyway, because I want them to be persistent: if I create a row of 8 random values for the chars of 10 characters, I'd like them to stay the same, not changing every time I change the file. What I do is to fake a rand() function, doing something like:

  • I define a seed. Any number bigger than 1 is ok, though I use to like to put prime numbers in there (prime numbers are fun!), like 7, or 13, or 1009, or 100003, or whatever. These tend to go on an auxiliary page in a cell named "Seed" so I can see only "Seed" in the formula, instead of 'Aux'!C6 or whatever the reference is.
  • Then I typically multiply pi * e * Seed (I think I also use pi * e^pi a lot, but anything more complex that just using pi or e, which are trascendent and so will do the job, is just me being redundant), and I keep the decimal part, so it's MOD(PI() * EXP(1) * Seed, 1)
  • And finally I want that number to be different for each cell, so I add something that is going to be different for every cell (the row and column numbers), so it's MOD(PI() * EXP(1)* Seed * ROW() * COLUMN(), 1).
    With that I get something to use as RAND() for every cell (the average tends to 0.5, after all), that stays there no matter how many times I change stuff, save and reload or whatever. And if I do need the numbers to change, then I just have to go to the Aux sheet and change the Seed value.
    Finally if you need it to emulate a RANDBETWEEN(1, 6) I just multiply by 6 and round up.

Right. My inner nerd like that there are almost no random tables. I can handle a full selection of dice, as long as I have simple formulæ which can be calculated mentally.

My understanding was that a standard deviation was defined by 50%, so 50% of the population within 1 standard deviation (by your definitions of stats between +1 and -1) then 1/4 in the next standard deviation- of course if you only go one direction you have to halve again for that, so 25% between 0 and 1, 12.5% between 1 and 2, 6.25% between 2 and three- obviously these being discreet numbers alters the conceptualization of "between"
As to keeping stats from fluctuating, I just use a paste values function rather than playing around with seed definitions. Then I can roll up 200 villagers and cut and paste values, keeping the randomized fluctuating calculation on another page for when I want the next village.

then I'm afraid your understanding is a bit off. The technical definition need not concern us here, but for the Normal distribution +/- one SD is about 66%, and +/- 2SD gets you to 95% but not the whole shebang.

This dice distribution is not Normal, but it is a useful zeroth order approximation.

Bob

No. It is 68% for the normal distribution. (My 98% was off though, it should be 99.7 or 99.8.) For general distributions we only have Chebyshev's inequality which is even weaker than your 50%.

1 Like

Then my statistics professor was wrong. Which honestly doesn't surprise me- he only lasted one semester and it wasn't his only major mistake. He also saw teaching as being a step down from his job in industrial engineering which he had been fired from, rumor was for cause...

Engineers should never teach stats, most of the horror stories I head about in my masters (of stats) program were of engineers who figured "they could follow the math" of stats.

First part which is not important:
There are 8 case for distribution 1, one for each stat at 0.
Distribution 2 is prolly 8! / (4! * 3!) = 280 cases?

Second part which seems interesting:
I would use the random walk to generate the distribution. Decide how many steps you are going to take and start moving points from one char to the other. At the end, normalize partial char by randomizing an extra step with a valid exchange.

For instance, you need 2 steps to go from dist1 to dist2.

You could even do this in Excel by using 1 row per random +1/-1 point and using calculate now to generate a new stat line.

Most of those engineers learnt their statistics from mathematicians, or on a lucky day statisticians, which clearly did not work out.

1 Like

See what you all did right there? First we assume that stats probably follow a normal distribution. Then we totally made up the statisticals of that distribution based on the usual range they should take. And finally we start scratching our heads thinking "oh wait, but if +3 is 3 standard deviations away, then this method is not valid..."

And I tell you: there won't be any valid method. But anyway, my point is that we started by totally inventing two assumptions that end just making things harder. Instead, for the -3 to +3 range, I went the other way around: characteristics should be normal-ish, which means that results on the middle are most likely and the far away they get the less probable they are. And if I add two D10's, which is fast, simple and uses one of my two tools at hand (the other being a pencil), then rolling a 11 is the most likely result, and the far away I get the less probable the number is. Pretty enough!

So my (first) version had a bigger standard deviation, and was easier to generate (anyway I don't think standard deviation should be 1 to cover the -3 to 3 range but the -5 to +5... but it was a pain because a +5 implied some virtues...). And that's why on the second I used weights to make big numbers less likely.

But what is a random table but a function downloaded from your brain's RAM to a piece of paper? :stuck_out_tongue_winking_eye:

I don't know how it is in the rest of the world, but here in the Iberia Tribunal most math teachers, outside maths career itself, aren't mathematicians, back in the day because there were quite few of us, and nowadays because we are mostly working in banks, myself included :sweat_smile:

And of course not all teachers have the Good Teacher virtue... some of them seem to be investing their virtues more often in getting virtues like Puissant Guile or Affinity with Carouse...

It is a function which was a little to complex to memorise, and thus not available in my brain's RAM for download.

Isn't the ±5 range covered well enough with a std dev of 1? It would mean (roughly) that one in a thousand has a given stat at +4 or +5 and another one at -4 or -5. About 2% would have some stat outside the ±3 interval. That does not seem off to me. Tom, Dick, and Harry do not have exceptional stats. Not even every hero has exceptional stats.