Menu
News
All News
Dungeons & Dragons
Level Up: Advanced 5th Edition
Pathfinder
Starfinder
Warhammer
2d20 System
Year Zero Engine
Industry News
Reviews
Dragon Reflections
White Dwarf Reflections
Columns
Weekly Digests
Weekly News Digest
Freebies, Sales & Bundles
RPG Print News
RPG Crowdfunding News
Game Content
ENterplanetary DimENsions
Mythological Figures
Opinion
Worlds of Design
Peregrine's Nest
RPG Evolution
Other Columns
From the Freelancing Frontline
Monster ENcyclopedia
WotC/TSR Alumni Look Back
4 Hours w/RSD (Ryan Dancey)
The Road to 3E (Jonathan Tweet)
Greenwood's Realms (Ed Greenwood)
Drawmij's TSR (Jim Ward)
Community
Forums & Topics
Forum List
Latest Posts
Forum list
*Dungeons & Dragons
Level Up: Advanced 5th Edition
D&D Older Editions, OSR, & D&D Variants
*TTRPGs General
*Pathfinder & Starfinder
EN Publishing
*Geek Talk & Media
Search forums
Chat/Discord
Resources
Wiki
Pages
Latest activity
Media
New media
New comments
Search media
Downloads
Latest reviews
Search resources
EN Publishing
Store
EN5ider
Adventures in ZEITGEIST
Awfully Cheerful Engine
What's OLD is NEW
Judge Dredd & The Worlds Of 2000AD
War of the Burning Sky
Level Up: Advanced 5E
Events & Releases
Upcoming Events
Private Events
Featured Events
Socials!
EN Publishing
Twitter
BlueSky
Facebook
Instagram
EN World
BlueSky
YouTube
Facebook
Twitter
Twitch
Podcast
Features
Top 5 RPGs Compiled Charts 2004-Present
Adventure Game Industry Market Research Summary (RPGs) V1.0
Ryan Dancey: Acquiring TSR
Q&A With Gary Gygax
D&D Rules FAQs
TSR, WotC, & Paizo: A Comparative History
D&D Pronunciation Guide
Million Dollar TTRPG Kickstarters
Tabletop RPG Podcast Hall of Fame
Eric Noah's Unofficial D&D 3rd Edition News
D&D in the Mainstream
D&D & RPG History
About Morrus
Log in
Register
What's new
Search
Search
Search titles only
By:
Forums & Topics
Forum List
Latest Posts
Forum list
*Dungeons & Dragons
Level Up: Advanced 5th Edition
D&D Older Editions, OSR, & D&D Variants
*TTRPGs General
*Pathfinder & Starfinder
EN Publishing
*Geek Talk & Media
Search forums
Chat/Discord
Menu
Log in
Register
Install the app
Install
Upgrade your account to a Community Supporter account and remove most of the site ads.
Community
General Tabletop Discussion
*TTRPGs General
25 or 32...what's the REAL "standard" point buy?
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Message
<blockquote data-quote="Anax" data-source="post: 1571658" data-attributes="member: 19868"><p>Okay. I've just decided to do a very very thorough analysis, just because. The basics of it are: I have a stompy Postgres server lying around, and I figured "Hmm, I bet I can calculate the exact probabilities (within constraints of floating point accuracy) using that." So I have. First I'm listing the basic results, then the method, then the tables. I'm also including the SQL I used to calculate at the very end, in case you're interested (or in case there's a problem with my method.) (EDIT: Oops, I just realized, actually, that the average stat mod total and the average sum of attribute scores shouldn't be integers. Apologies for that, but since they're not that important, I don't plan to run the analysis again.)</p><p></p><p></p><p>The first tidbits:</p><p></p><p>1) 39.94% of all pure 3d6 rolls meet the >0 modifier and one stat >13 rule.</p><p>2) 87.33% of all 4d6 drop lowest rolls meet those constraints.</p><p></p><p></p><p>Analysis of the percentiles, first using 0 points for sub-8 stats. Remember that these are the number of valid (by the above rules) rolls which are worth at least that many points.</p><p></p><p>1) Using 3d6, the 50th percentile is somewhere between 24 and 25 points. 25 points is at 44.4527%. 28 points is at 25.9440%. 30 points is at 17.3194%. 35 points is at 5.5482%. About 50% of rolls fall between 21 and 28 points. About 75% of rolls fall between 20 and 31 points.</p><p></p><p>2) Using 4d6 drop the lowest, the 50th percentile is somewhere between 30 and 31 points. 25 points is at 78.1886%. 28 points is at 62.9516%. 30 points is at 52.5320%. 35 points is at 29.5290%. About 50% of rolls fall between 25 and 36 points. About 75% of rolls fall between 23 and 40 points.</p><p></p><p></p><p>And the same analysis using -1 point for each step below 8:</p><p></p><p>1) Using 3d6, the 50th percentile is somewhere between 23 and 24 points. 25 points is at 38.1926%. 28 points is at 22.2716%. 30 points is at 14.9498%. 35 points is at 4.8816%. About 50% of rolls fall between 20 and 27 points. About 75% of rolls fall between 18 and 30 points.</p><p></p><p>2) Using 4d6 drop the lowest, the 50th percentile is right at about 30 points. 25 points is at 75.1108%. 28 points is at 60.3289%. 30 points is at 50.3413%. 35 points is at 28.3791%. About 50% of rolls fall between 25 and 36 points. About 75% of rolls fall between 22 and 41 points.</p><p></p><p></p><p>So what can we say based on those numbers? The most obvious thing to me is that it highlights the potential for serious inequality in die rolling--using the basic system of 4d6 drop the lowest, you have a really large range of point values in the middle 50% of the spectrum (whether or not we're counting negative points.) The range of 25 to 36 is huge, considering that people have been talking about a 10 point spread maybe being worth about ECL +1. </p><p></p><p>The second thing is that the numbers are pretty much what stephenh pointed out: 4d6 drop the lowest is about on par (in the average) with 30 point buy. 3d6 and keep is about on par with 25 point buy. If I wasn't already a point buy fan, this would make me think more than twice about the "choose between point buy and 4d6 drop the lowest" strategy, unless 30 point PB is being used.</p><p></p><p>And the third is that allowing "buy downs" from 8 doesn't change things that significantly, at least in this analysis. It reduces the cost to reach a given percentile by about one point. In the real world, of course, allowing this gives a minmaxer a lot of leeway, so the averages don't really work out. (Which is also why the higher valued stats cost more.) By cutting out the choice of dropping a stat super-low and increasing the costs of higher stats, they've done a pretty nice job of keeping this system sane.</p><p></p><p>Anyway, hope these numbers are interesting to you, and apologies to stephenh for wanting to do my own test to check his results. <img src="https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png" class="smilie smilie--emoji" loading="lazy" width="64" height="64" alt=":)" title="Smile :)" data-smilie="1"data-shortname=":)" /></p><p></p><p></p><p>The super-brute-force approach I took was to create tables representing a d6, then the sum of 3d6, then the sum of 4d6 drop the lowest. All of these tables were of the form (value, probability, points, modifier). The next step was to create tables of the *entire possible set* of stats rolls (that is, 3d6 crossed with itself six times, or 4d6 crossed with itself six times.) Included in each row is the number of points it costs for those together, as well as the sum of the rolls, and the sum of the modifiers. (No real reason for sum of the rolls, just thought it would be interesting to display.) Generating the 3d6 or 4d6 stat rolls table for a given point cost table takes about four minutes each. Limiting by the >0 modifier and one >13 stat rules (and grouping on the point total) takes about a minute after that for each one. Then the limited data needs to be renormalized to find the probabilities out of that pool. I was actually impressed with how quick this was (and that it didn't load the machine beyond belief.)</p><p></p><p>First pass is with sub-8 stats counting as zero cost--that is, you can choose to have them, but you get no point-wise benefit by doing so. Second pass gives -1 point for each step below 8.</p><p></p><p>And now the results. In these tables, st_pc is the percentile chance of getting at least that many points. st_pt is the number of points. st_m is the average stat modifier for the rolls that have that number of points. st_s is the average stat sum for the rolls that have that number of points. I've included the full set of possibilities, although the probabilities get very very low on the high end. (The probability of the highest value for 3d6 is only 2.4653e-14.) The probabilities are only shown to four decimal places.</p><p></p><p>[code]</p><p>3d6, sorted by number of points,</p><p>0 points for sub-8 stats:</p><p> st_pc | st_pt | st_m | st_s</p><p>----------+-------+------+------</p><p> 100.0000 | 14 | 1 | 62</p><p> 99.9130 | 15 | 1 | 63</p><p> 99.4639 | 16 | 1 | 63</p><p> 98.0996 | 17 | 1 | 64</p><p> 95.2541 | 18 | 1 | 64</p><p> 90.6155 | 19 | 1 | 65</p><p> 84.2811 | 20 | 2 | 65</p><p> 76.6736 | 21 | 2 | 66</p><p> 68.4514 | 22 | 2 | 66</p><p> 60.1170 | 23 | 2 | 67</p><p> 52.0366 | 24 | 2 | 67</p><p> 44.4527 | 25 | 2 | 67</p><p> 37.5313 | 26 | 2 | 67</p><p> 31.3509 | 27 | 3 | 68</p><p> 25.9440 | 28 | 3 | 68</p><p> 21.2815 | 29 | 3 | 69</p><p> 17.3194 | 30 | 3 | 69</p><p> 13.9892 | 31 | 3 | 70</p><p> 11.2194 | 32 | 4 | 70</p><p> 8.9307 | 33 | 4 | 71</p><p> 7.0656 | 34 | 4 | 71</p><p> 5.5482 | 35 | 5 | 72</p><p> 4.3304 | 36 | 5 | 72</p><p> 3.3577 | 37 | 5 | 73</p><p> 2.5858 | 38 | 6 | 74</p><p> 1.9802 | 39 | 6 | 74</p><p> 1.5063 | 40 | 6 | 75</p><p> 1.1382 | 41 | 7 | 76</p><p> 0.8560 | 42 | 7 | 76</p><p> 0.6385 | 43 | 7 | 78</p><p> 0.4743 | 44 | 8 | 78</p><p> 0.3499 | 45 | 8 | 78</p><p> 0.2564 | 46 | 9 | 80</p><p> 0.1871 | 47 | 9 | 80</p><p> 0.1355 | 48 | 9 | 81</p><p> 0.0976 | 49 | 10 | 82</p><p> 0.0700 | 50 | 10 | 82</p><p> 0.0497 | 51 | 10 | 83</p><p> 0.0353 | 52 | 11 | 84</p><p> 0.0248 | 53 | 11 | 84</p><p> 0.0173 | 54 | 12 | 86</p><p> 0.0121 | 55 | 11 | 85</p><p> 0.0083 | 56 | 12 | 87</p><p> 0.0057 | 57 | 13 | 88</p><p> 0.0039 | 58 | 12 | 87</p><p> 0.0026 | 59 | 13 | 89</p><p> 0.0018 | 60 | 14 | 90</p><p> 0.0012 | 61 | 13 | 89</p><p> 0.0008 | 62 | 14 | 91</p><p> 0.0005 | 63 | 14 | 91</p><p> 0.0003 | 64 | 15 | 92</p><p> 0.0002 | 65 | 15 | 93</p><p> 0.0001 | 66 | 15 | 93</p><p> 0.0001 | 67 | 16 | 94</p><p> 0.0001 | 68 | 16 | 94</p><p> 0.0000 | 69 | 16 | 95</p><p> 0.0000 | 70 | 17 | 97</p><p> 0.0000 | 71 | 17 | 96</p><p> 0.0000 | 72 | 18 | 97</p><p> 0.0000 | 73 | 18 | 99</p><p> 0.0000 | 74 | 17 | 97</p><p> 0.0000 | 75 | 19 | 99</p><p> 0.0000 | 76 | 19 | 100</p><p> 0.0000 | 77 | 18 | 98</p><p> 0.0000 | 78 | 20 | 101</p><p> 0.0000 | 79 | 20 | 101</p><p> 0.0000 | 80 | 19 | 100</p><p> 0.0000 | 81 | 20 | 102</p><p> 0.0000 | 82 | 20 | 103</p><p> 0.0000 | 83 | 21 | 103</p><p> 0.0000 | 84 | 21 | 104</p><p> 0.0000 | 85 | 21 | 104</p><p> 0.0000 | 86 | 22 | 104</p><p> 0.0000 | 87 | 22 | 105</p><p> 0.0000 | 88 | 22 | 105</p><p> 0.0000 | 90 | 22 | 106</p><p> 0.0000 | 93 | 23 | 107</p><p> 0.0000 | 96 | 24 | 108</p><p>[/code]</p><p></p><p>[code]</p><p>4d6 drop the lowest, sorted by number of points,</p><p>0 points for sub-8 stats:</p><p> st_pc | st_pt | st_m | st_s</p><p>----------+-------+------+------</p><p> 100.0000 | 14 | 1 | 62</p><p> 99.9891 | 15 | 1 | 63</p><p> 99.9205 | 16 | 1 | 63</p><p> 99.6773 | 17 | 1 | 64</p><p> 99.0864 | 18 | 1 | 64</p><p> 97.9732 | 19 | 1 | 65</p><p> 96.2144 | 20 | 2 | 65</p><p> 93.7607 | 21 | 2 | 66</p><p> 90.6571 | 22 | 2 | 66</p><p> 86.9730 | 23 | 2 | 67</p><p> 82.7863 | 24 | 2 | 67</p><p> 78.1886 | 25 | 2 | 67</p><p> 73.2836 | 26 | 2 | 67</p><p> 68.1708 | 27 | 3 | 68</p><p> 62.9516 | 28 | 3 | 68</p><p> 57.7107 | 29 | 3 | 69</p><p> 52.5320 | 30 | 3 | 69</p><p> 47.4779 | 31 | 3 | 70</p><p> 42.6138 | 32 | 4 | 70</p><p> 37.9726 | 33 | 4 | 71</p><p> 33.6070 | 34 | 4 | 71</p><p> 29.5290 | 35 | 5 | 72</p><p> 25.7685 | 36 | 5 | 72</p><p> 22.3289 | 37 | 5 | 73</p><p> 19.2144 | 38 | 6 | 74</p><p> 16.4190 | 39 | 6 | 74</p><p> 13.9374 | 40 | 6 | 75</p><p> 11.7434 | 41 | 7 | 76</p><p> 9.8350 | 42 | 7 | 76</p><p> 8.1732 | 43 | 7 | 78</p><p> 6.7511 | 44 | 8 | 78</p><p> 5.5369 | 45 | 8 | 78</p><p> 4.5092 | 46 | 9 | 80</p><p> 3.6494 | 47 | 9 | 80</p><p> 2.9327 | 48 | 9 | 81</p><p> 2.3394 | 49 | 10 | 82</p><p> 1.8571 | 50 | 10 | 82</p><p> 1.4596 | 51 | 10 | 83</p><p> 1.1434 | 52 | 11 | 84</p><p> 0.8876 | 53 | 11 | 84</p><p> 0.6840 | 54 | 12 | 86</p><p> 0.5254 | 55 | 11 | 85</p><p> 0.3985 | 56 | 12 | 87</p><p> 0.3017 | 57 | 13 | 88</p><p> 0.2266 | 58 | 12 | 87</p><p> 0.1679 | 59 | 13 | 89</p><p> 0.1252 | 60 | 14 | 90</p><p> 0.0913 | 61 | 13 | 89</p><p> 0.0667 | 62 | 14 | 91</p><p> 0.0485 | 63 | 14 | 91</p><p> 0.0344 | 64 | 15 | 92</p><p> 0.0249 | 65 | 15 | 93</p><p> 0.0174 | 66 | 15 | 93</p><p> 0.0122 | 67 | 16 | 94</p><p> 0.0087 | 68 | 16 | 94</p><p> 0.0058 | 69 | 16 | 95</p><p> 0.0041 | 70 | 17 | 97</p><p> 0.0028 | 71 | 17 | 96</p><p> 0.0018 | 72 | 18 | 97</p><p> 0.0013 | 73 | 18 | 99</p><p> 0.0008 | 74 | 17 | 97</p><p> 0.0005 | 75 | 19 | 99</p><p> 0.0004 | 76 | 19 | 100</p><p> 0.0002 | 77 | 18 | 98</p><p> 0.0001 | 78 | 20 | 101</p><p> 0.0001 | 79 | 20 | 101</p><p> 0.0000 | 80 | 19 | 100</p><p> 0.0000 | 81 | 20 | 102</p><p> 0.0000 | 82 | 20 | 103</p><p> 0.0000 | 83 | 21 | 103</p><p> 0.0000 | 84 | 21 | 104</p><p> 0.0000 | 85 | 21 | 104</p><p> 0.0000 | 86 | 22 | 104</p><p> 0.0000 | 87 | 22 | 105</p><p> 0.0000 | 88 | 22 | 105</p><p> 0.0000 | 90 | 22 | 106</p><p> 0.0000 | 93 | 23 | 107</p><p> 0.0000 | 96 | 24 | 108</p><p>[/code]</p><p></p><p>[code]</p><p>3d6, sorted by number of points,</p><p>-1 point per step for sub-8 stats:</p><p> st_pc | st_pt | st_m | st_s</p><p>----------+-------+------+------</p><p> 100.0000 | 14 | 1 | 62</p><p> 99.7790 | 15 | 1 | 63</p><p> 98.6284 | 16 | 1 | 64</p><p> 95.7917 | 17 | 1 | 64</p><p> 90.9264 | 18 | 1 | 65</p><p> 84.1974 | 19 | 1 | 65</p><p> 76.3813 | 20 | 2 | 66</p><p> 68.2589 | 21 | 2 | 66</p><p> 60.1652 | 22 | 2 | 66</p><p> 52.3084 | 23 | 2 | 67</p><p> 44.9261 | 24 | 2 | 67</p><p> 38.1926 | 25 | 3 | 68</p><p> 32.1762 | 26 | 3 | 68</p><p> 26.8779 | 27 | 3 | 69</p><p> 22.2716 | 28 | 3 | 70</p><p> 18.3142 | 29 | 4 | 70</p><p> 14.9498 | 30 | 4 | 71</p><p> 12.1168 | 31 | 4 | 72</p><p> 9.7524 | 32 | 5 | 72</p><p> 7.7957 | 33 | 5 | 73</p><p> 6.1895 | 34 | 5 | 74</p><p> 4.8816 | 35 | 6 | 75</p><p> 3.8249 | 36 | 6 | 75</p><p> 2.9776 | 37 | 7 | 76</p><p> 2.3032 | 38 | 7 | 77</p><p> 1.7703 | 39 | 7 | 77</p><p> 1.3522 | 40 | 8 | 78</p><p> 1.0264 | 41 | 8 | 79</p><p> 0.7743 | 42 | 8 | 79</p><p> 0.5806 | 43 | 9 | 80</p><p> 0.4326 | 44 | 9 | 81</p><p> 0.3204 | 45 | 9 | 81</p><p> 0.2359 | 46 | 10 | 82</p><p> 0.1726 | 47 | 10 | 83</p><p> 0.1255 | 48 | 10 | 83</p><p> 0.0907 | 49 | 11 | 84</p><p> 0.0652 | 50 | 11 | 85</p><p> 0.0466 | 51 | 11 | 85</p><p> 0.0331 | 52 | 12 | 86</p><p> 0.0233 | 53 | 12 | 86</p><p> 0.0164 | 54 | 12 | 87</p><p> 0.0114 | 55 | 13 | 88</p><p> 0.0079 | 56 | 13 | 88</p><p> 0.0054 | 57 | 13 | 89</p><p> 0.0037 | 58 | 13 | 90</p><p> 0.0025 | 59 | 14 | 90</p><p> 0.0017 | 60 | 14 | 91</p><p> 0.0011 | 61 | 14 | 91</p><p> 0.0008 | 62 | 15 | 92</p><p> 0.0005 | 63 | 15 | 93</p><p> 0.0003 | 64 | 15 | 93</p><p> 0.0002 | 65 | 16 | 94</p><p> 0.0001 | 66 | 16 | 94</p><p> 0.0001 | 67 | 16 | 95</p><p> 0.0001 | 68 | 17 | 95</p><p> 0.0000 | 69 | 17 | 96</p><p> 0.0000 | 70 | 17 | 96</p><p> 0.0000 | 71 | 17 | 97</p><p> 0.0000 | 72 | 18 | 97</p><p> 0.0000 | 73 | 18 | 98</p><p> 0.0000 | 74 | 18 | 99</p><p> 0.0000 | 75 | 19 | 99</p><p> 0.0000 | 76 | 19 | 100</p><p> 0.0000 | 77 | 19 | 100</p><p> 0.0000 | 78 | 20 | 101</p><p> 0.0000 | 79 | 19 | 101</p><p> 0.0000 | 80 | 20 | 101</p><p> 0.0000 | 81 | 20 | 102</p><p> 0.0000 | 82 | 20 | 103</p><p> 0.0000 | 83 | 21 | 103</p><p> 0.0000 | 84 | 21 | 104</p><p> 0.0000 | 85 | 21 | 104</p><p> 0.0000 | 86 | 22 | 104</p><p> 0.0000 | 87 | 22 | 105</p><p> 0.0000 | 88 | 22 | 105</p><p> 0.0000 | 90 | 22 | 106</p><p> 0.0000 | 93 | 23 | 107</p><p> 0.0000 | 96 | 24 | 108</p><p>[/code]</p><p></p><p>[code]</p><p>4d6 drop the lowest, sorted by number of points,</p><p>-1 point per step for sub-8 stats:</p><p> st_pc | st_pt | st_m | st_s</p><p>----------+-------+------+------</p><p> 100.0000 | 14 | 1 | 62</p><p> 99.9711 | 15 | 1 | 63</p><p> 99.7878 | 16 | 1 | 64</p><p> 99.2486 | 17 | 1 | 64</p><p> 98.1720 | 18 | 1 | 65</p><p> 96.4416 | 19 | 1 | 65</p><p> 94.0743 | 20 | 2 | 66</p><p> 91.1697 | 21 | 2 | 66</p><p> 87.7763 | 22 | 2 | 66</p><p> 83.9239 | 23 | 2 | 67</p><p> 79.6750 | 24 | 2 | 67</p><p> 75.1108 | 25 | 3 | 68</p><p> 70.3122 | 26 | 3 | 68</p><p> 65.3584 | 27 | 3 | 69</p><p> 60.3289 | 28 | 3 | 70</p><p> 55.3002 | 29 | 4 | 70</p><p> 50.3413 | 30 | 4 | 71</p><p> 45.5126 | 31 | 4 | 72</p><p> 40.8647 | 32 | 5 | 72</p><p> 36.4392 | 33 | 5 | 73</p><p> 32.2691 | 34 | 5 | 74</p><p> 28.3791 | 35 | 6 | 75</p><p> 24.7859 | 36 | 6 | 75</p><p> 21.4985 | 37 | 7 | 76</p><p> 18.5190 | 38 | 7 | 77</p><p> 15.8429 | 39 | 7 | 77</p><p> 13.4608 | 40 | 8 | 78</p><p> 11.3589 | 41 | 8 | 79</p><p> 9.5200 | 42 | 8 | 79</p><p> 7.9244 | 43 | 9 | 80</p><p> 6.5519 | 44 | 9 | 81</p><p> 5.3797 | 45 | 9 | 81</p><p> 4.3885 | 46 | 10 | 82</p><p> 3.5539 | 47 | 10 | 83</p><p> 2.8609 | 48 | 10 | 83</p><p> 2.2847 | 49 | 11 | 84</p><p> 1.8149 | 50 | 11 | 85</p><p> 1.4297 | 51 | 11 | 85</p><p> 1.1199 | 52 | 12 | 86</p><p> 0.8711 | 53 | 12 | 86</p><p> 0.6721 | 54 | 12 | 87</p><p> 0.5162 | 55 | 13 | 88</p><p> 0.3926 | 56 | 13 | 88</p><p> 0.2971 | 57 | 13 | 89</p><p> 0.2235 | 58 | 13 | 90</p><p> 0.1660 | 59 | 14 | 90</p><p> 0.1235 | 60 | 14 | 91</p><p> 0.0904 | 61 | 14 | 91</p><p> 0.0660 | 62 | 15 | 92</p><p> 0.0480 | 63 | 15 | 93</p><p> 0.0342 | 64 | 15 | 93</p><p> 0.0247 | 65 | 16 | 94</p><p> 0.0173 | 66 | 16 | 94</p><p> 0.0121 | 67 | 16 | 95</p><p> 0.0086 | 68 | 17 | 95</p><p> 0.0058 | 69 | 17 | 96</p><p> 0.0040 | 70 | 17 | 96</p><p> 0.0027 | 71 | 17 | 97</p><p> 0.0018 | 72 | 18 | 97</p><p> 0.0013 | 73 | 18 | 98</p><p> 0.0008 | 74 | 18 | 99</p><p> 0.0005 | 75 | 19 | 99</p><p> 0.0004 | 76 | 19 | 100</p><p> 0.0002 | 77 | 19 | 100</p><p> 0.0001 | 78 | 20 | 101</p><p> 0.0001 | 79 | 19 | 101</p><p> 0.0000 | 80 | 20 | 101</p><p> 0.0000 | 81 | 20 | 102</p><p> 0.0000 | 82 | 20 | 103</p><p> 0.0000 | 83 | 21 | 103</p><p> 0.0000 | 84 | 21 | 104</p><p> 0.0000 | 85 | 21 | 104</p><p> 0.0000 | 86 | 22 | 104</p><p> 0.0000 | 87 | 22 | 105</p><p> 0.0000 | 88 | 22 | 105</p><p> 0.0000 | 90 | 22 | 106</p><p> 0.0000 | 93 | 23 | 107</p><p> 0.0000 | 96 | 24 | 108</p><p>[/code]</p><p></p><p>And here's the code I used to run the analysis. My running times were on a dual Xeon 2.66Ghz system with 2GB of memory and fast SCSI disks, so it might take a while on something smaller. I think I/O writing out the intermediate tables was the main bottleneck. Oh, also expect to burn a few GB of disk on those tables. The database used was Postgresql 7.4. For another database, you'll almost certainly have to change the code.</p><p></p><p>[code]</p><p>create table st_pt (n int, pt int);</p><p>insert into st_pt values (3, 0);</p><p>insert into st_pt values (4, 0);</p><p>insert into st_pt values (5, 0);</p><p>insert into st_pt values (6, 0);</p><p>insert into st_pt values (7, 0);</p><p>insert into st_pt values (8, 0);</p><p>insert into st_pt values (9, 1);</p><p>insert into st_pt values (10, 2);</p><p>insert into st_pt values (11, 3);</p><p>insert into st_pt values (12, 4);</p><p>insert into st_pt values (13, 5);</p><p>insert into st_pt values (14, 6);</p><p>insert into st_pt values (15, 8);</p><p>insert into st_pt values (16, 10);</p><p>insert into st_pt values (17, 13);</p><p>insert into st_pt values (18, 16);</p><p></p><p>-- used in second run: negative point values for low amounts</p><p>-- insert into st_pt values (3, -5);</p><p>-- insert into st_pt values (4, -4);</p><p>-- insert into st_pt values (5, -3);</p><p>-- insert into st_pt values (6, -2);</p><p>-- insert into st_pt values (7, -1);</p><p>-- insert into st_pt values (8, 0);</p><p>-- insert into st_pt values (9, 1);</p><p>-- insert into st_pt values (10, 2);</p><p>-- insert into st_pt values (11, 3);</p><p>-- insert into st_pt values (12, 4);</p><p>-- insert into st_pt values (13, 5);</p><p>-- insert into st_pt values (14, 6);</p><p>-- insert into st_pt values (15, 8);</p><p>-- insert into st_pt values (16, 10);</p><p>-- insert into st_pt values (17, 13);</p><p>-- insert into st_pt values (18, 16);</p><p></p><p>create table st_mod (n int, m int);</p><p>insert into st_mod values (3, -4);</p><p>insert into st_mod values (4, -3);</p><p>insert into st_mod values (5, -3);</p><p>insert into st_mod values (6, -2);</p><p>insert into st_mod values (7, -2);</p><p>insert into st_mod values (8, -1);</p><p>insert into st_mod values (9, -1);</p><p>insert into st_mod values (10, 0);</p><p>insert into st_mod values (11, 0);</p><p>insert into st_mod values (12, 1);</p><p>insert into st_mod values (13, 1);</p><p>insert into st_mod values (14, 2);</p><p>insert into st_mod values (15, 2);</p><p>insert into st_mod values (16, 3);</p><p>insert into st_mod values (17, 3);</p><p>insert into st_mod values (18, 4);</p><p></p><p>create table d6 (n int, p float);</p><p>insert into d6 values (1, 1.0/6.0);</p><p>insert into d6 values (2, 1.0/6.0);</p><p>insert into d6 values (3, 1.0/6.0);</p><p>insert into d6 values (4, 1.0/6.0);</p><p>insert into d6 values (5, 1.0/6.0);</p><p>insert into d6 values (6, 1.0/6.0);</p><p></p><p>create table s3d6 (p float, n int, pt int, m int);</p><p>insert into s3d6 (p, n, pt, m)</p><p> select sum(a.p * b.p * c.p) as p,</p><p> (a.n + b.n + c.n) as x,</p><p> pt,</p><p> m</p><p> from d6 a, d6 b, d6 c, st_mod, st_pt</p><p> where st_mod.n = (a.n+b.n+c.n)</p><p> and st_pt.n = st_mod.n</p><p> group by x, pt, m;</p><p></p><p>create table t4d6 (a int, b int, c int, d int, p float);</p><p>insert into t4d6</p><p> select a.n, b.n, c.n, d.n, sum(a.p*b.p*c.p*d.p)</p><p> from d6 a, d6 b, d6 c, d6 d</p><p> group by a.n, b.n, c.n, d.n;</p><p></p><p>update t4d6 set a = 0 where a <= b and a <= c and a <= d;</p><p>update t4d6 set b = 0 where b <= a and b <= c and b <= d;</p><p>update t4d6 set c = 0 where c <= a and c <= b and c <= d;</p><p>update t4d6 set d = 0 where d <= a and d <= b and d <= c;</p><p></p><p>create table s4d6 (p float, n int, pt int, m int);</p><p>insert into s4d6 (p, n, pt, m)</p><p> select sum(p) as p,</p><p> (a+b+c+d) as x,</p><p> pt,</p><p> m</p><p> from t4d6, st_mod, st_pt</p><p> where st_mod.n = (a+b+c+d)</p><p> and st_pt.n = st_mod.n</p><p> group by x, pt, m;</p><p></p><p>create table stats3d6 (st_p float, st_pt int, st_m int, st_s int,</p><p> a int, b int, c int, d int, e int, f int);</p><p></p><p>select 'Started at ' || current_time;</p><p>insert into stats3d6 (a, b, c, d, e, f, st_p, st_pt, st_m, st_s)</p><p> select a.n as a,</p><p> b.n as b,</p><p> c.n as c,</p><p> d.n as d,</p><p> e.n as e,</p><p> f.n as f,</p><p> a.p*b.p*c.p*d.p*e.p*f.p as st_p,</p><p> a.pt + b.pt + c.pt + d.pt + e.pt + f.pt as st_pt,</p><p> a.m+b.m+c.m+d.m+e.m+f.m as st_m,</p><p> a.n+b.n+c.n+d.n+e.n+f.n as st_s</p><p> from s3d6 a, s3d6 b, s3d6 c, s3d6 d, s3d6 e, s3d6 f;</p><p>select 'Finished at ' || current_time;</p><p></p><p>create table stats4d6 (st_p float, st_pt int, st_m int, st_s int,</p><p> a int, b int, c int, d int, e int, f int);</p><p></p><p>select 'Started at ' || current_time;</p><p>insert into stats4d6 (a, b, c, d, e, f, st_p, st_pt, st_m, st_s)</p><p> select a.n as a,</p><p> b.n as b,</p><p> c.n as c,</p><p> d.n as d,</p><p> e.n as e,</p><p> f.n as f,</p><p> a.p*b.p*c.p*d.p*e.p*f.p as st_p,</p><p> a.pt + b.pt + c.pt + d.pt + e.pt + f.pt as st_pt,</p><p> a.m+b.m+c.m+d.m+e.m+f.m as st_m,</p><p> a.n+b.n+c.n+d.n+e.n+f.n as st_s</p><p> from s4d6 a, s4d6 b, s4d6 c, s4d6 d, s4d6 e, s4d6 f;</p><p>select 'Finished at ' || current_time;</p><p></p><p>create table stats3d6l (st_p float, st_pt int, st_m int, st_s int);</p><p></p><p>insert into stats3d6l (st_p, st_pt, st_m, st_s)</p><p> select sum(st_p),</p><p> st_pt,</p><p> avg(st_m),</p><p> avg(st_s)</p><p> from stats3d6</p><p> where (a > 13 or b > 13 or c > 13 or d > 13 or e > 13 or f > 13)</p><p> and st_m > 0</p><p> group by st_pt;</p><p></p><p>create table stats4d6l (st_p float, st_pt int, st_m int, st_s int);</p><p></p><p>select 'Started at ' || current_time;</p><p>insert into stats4d6l (st_p, st_pt, st_m, st_s)</p><p> select sum(st_p),</p><p> st_pt,</p><p> avg(st_m),</p><p> avg(st_s)</p><p> from stats4d6</p><p> where (a > 13 or b > 13 or c > 13 or d > 13 or e > 13 or f > 13)</p><p> and st_m > 0</p><p> group by st_pt;</p><p>select 'Finished at ' || current_time;</p><p></p><p>-- Normalize</p><p></p><p>create table stats3d6l_norm (st_p float, st_pt int, st_m int, st_s int);</p><p>insert into stats3d6l_norm (st_p, st_pt, st_m, st_s)</p><p> select (st_p / (select sum(st_p) from stats3d6l)), st_pt, st_m, st_s</p><p> from stats3d6l;</p><p></p><p>create table stats4d6l_norm (st_p float, st_pt int, st_m int, st_s int);</p><p>insert into stats4d6l_norm (st_p, st_pt, st_m, st_s)</p><p> select (st_p / (select sum(st_p) from stats4d6l)), st_pt, st_m, st_s</p><p> from stats4d6l;</p><p></p><p>-- And the percentile output</p><p></p><p>select</p><p> round(cast ((select sum(b.st_p) from stats3d6l_norm b</p><p> where b.st_pt >= a.st_pt) as numeric)*100.0, 4) as st_pc,</p><p> st_pt, st_m, st_s</p><p> from stats3d6l_norm a</p><p> order by st_pt;</p><p></p><p>select</p><p> round(cast ((select sum(b.st_p) from stats4d6l_norm b</p><p> where b.st_pt >= a.st_pt) as numeric)*100.0, 4) as st_pc,</p><p> st_pt, st_m, st_s</p><p> from stats4d6l_norm a</p><p> order by st_pt;</p><p></p><p>[/code]</p></blockquote><p></p>
[QUOTE="Anax, post: 1571658, member: 19868"] Okay. I've just decided to do a very very thorough analysis, just because. The basics of it are: I have a stompy Postgres server lying around, and I figured "Hmm, I bet I can calculate the exact probabilities (within constraints of floating point accuracy) using that." So I have. First I'm listing the basic results, then the method, then the tables. I'm also including the SQL I used to calculate at the very end, in case you're interested (or in case there's a problem with my method.) (EDIT: Oops, I just realized, actually, that the average stat mod total and the average sum of attribute scores shouldn't be integers. Apologies for that, but since they're not that important, I don't plan to run the analysis again.) The first tidbits: 1) 39.94% of all pure 3d6 rolls meet the >0 modifier and one stat >13 rule. 2) 87.33% of all 4d6 drop lowest rolls meet those constraints. Analysis of the percentiles, first using 0 points for sub-8 stats. Remember that these are the number of valid (by the above rules) rolls which are worth at least that many points. 1) Using 3d6, the 50th percentile is somewhere between 24 and 25 points. 25 points is at 44.4527%. 28 points is at 25.9440%. 30 points is at 17.3194%. 35 points is at 5.5482%. About 50% of rolls fall between 21 and 28 points. About 75% of rolls fall between 20 and 31 points. 2) Using 4d6 drop the lowest, the 50th percentile is somewhere between 30 and 31 points. 25 points is at 78.1886%. 28 points is at 62.9516%. 30 points is at 52.5320%. 35 points is at 29.5290%. About 50% of rolls fall between 25 and 36 points. About 75% of rolls fall between 23 and 40 points. And the same analysis using -1 point for each step below 8: 1) Using 3d6, the 50th percentile is somewhere between 23 and 24 points. 25 points is at 38.1926%. 28 points is at 22.2716%. 30 points is at 14.9498%. 35 points is at 4.8816%. About 50% of rolls fall between 20 and 27 points. About 75% of rolls fall between 18 and 30 points. 2) Using 4d6 drop the lowest, the 50th percentile is right at about 30 points. 25 points is at 75.1108%. 28 points is at 60.3289%. 30 points is at 50.3413%. 35 points is at 28.3791%. About 50% of rolls fall between 25 and 36 points. About 75% of rolls fall between 22 and 41 points. So what can we say based on those numbers? The most obvious thing to me is that it highlights the potential for serious inequality in die rolling--using the basic system of 4d6 drop the lowest, you have a really large range of point values in the middle 50% of the spectrum (whether or not we're counting negative points.) The range of 25 to 36 is huge, considering that people have been talking about a 10 point spread maybe being worth about ECL +1. The second thing is that the numbers are pretty much what stephenh pointed out: 4d6 drop the lowest is about on par (in the average) with 30 point buy. 3d6 and keep is about on par with 25 point buy. If I wasn't already a point buy fan, this would make me think more than twice about the "choose between point buy and 4d6 drop the lowest" strategy, unless 30 point PB is being used. And the third is that allowing "buy downs" from 8 doesn't change things that significantly, at least in this analysis. It reduces the cost to reach a given percentile by about one point. In the real world, of course, allowing this gives a minmaxer a lot of leeway, so the averages don't really work out. (Which is also why the higher valued stats cost more.) By cutting out the choice of dropping a stat super-low and increasing the costs of higher stats, they've done a pretty nice job of keeping this system sane. Anyway, hope these numbers are interesting to you, and apologies to stephenh for wanting to do my own test to check his results. :) The super-brute-force approach I took was to create tables representing a d6, then the sum of 3d6, then the sum of 4d6 drop the lowest. All of these tables were of the form (value, probability, points, modifier). The next step was to create tables of the *entire possible set* of stats rolls (that is, 3d6 crossed with itself six times, or 4d6 crossed with itself six times.) Included in each row is the number of points it costs for those together, as well as the sum of the rolls, and the sum of the modifiers. (No real reason for sum of the rolls, just thought it would be interesting to display.) Generating the 3d6 or 4d6 stat rolls table for a given point cost table takes about four minutes each. Limiting by the >0 modifier and one >13 stat rules (and grouping on the point total) takes about a minute after that for each one. Then the limited data needs to be renormalized to find the probabilities out of that pool. I was actually impressed with how quick this was (and that it didn't load the machine beyond belief.) First pass is with sub-8 stats counting as zero cost--that is, you can choose to have them, but you get no point-wise benefit by doing so. Second pass gives -1 point for each step below 8. And now the results. In these tables, st_pc is the percentile chance of getting at least that many points. st_pt is the number of points. st_m is the average stat modifier for the rolls that have that number of points. st_s is the average stat sum for the rolls that have that number of points. I've included the full set of possibilities, although the probabilities get very very low on the high end. (The probability of the highest value for 3d6 is only 2.4653e-14.) The probabilities are only shown to four decimal places. [code] 3d6, sorted by number of points, 0 points for sub-8 stats: st_pc | st_pt | st_m | st_s ----------+-------+------+------ 100.0000 | 14 | 1 | 62 99.9130 | 15 | 1 | 63 99.4639 | 16 | 1 | 63 98.0996 | 17 | 1 | 64 95.2541 | 18 | 1 | 64 90.6155 | 19 | 1 | 65 84.2811 | 20 | 2 | 65 76.6736 | 21 | 2 | 66 68.4514 | 22 | 2 | 66 60.1170 | 23 | 2 | 67 52.0366 | 24 | 2 | 67 44.4527 | 25 | 2 | 67 37.5313 | 26 | 2 | 67 31.3509 | 27 | 3 | 68 25.9440 | 28 | 3 | 68 21.2815 | 29 | 3 | 69 17.3194 | 30 | 3 | 69 13.9892 | 31 | 3 | 70 11.2194 | 32 | 4 | 70 8.9307 | 33 | 4 | 71 7.0656 | 34 | 4 | 71 5.5482 | 35 | 5 | 72 4.3304 | 36 | 5 | 72 3.3577 | 37 | 5 | 73 2.5858 | 38 | 6 | 74 1.9802 | 39 | 6 | 74 1.5063 | 40 | 6 | 75 1.1382 | 41 | 7 | 76 0.8560 | 42 | 7 | 76 0.6385 | 43 | 7 | 78 0.4743 | 44 | 8 | 78 0.3499 | 45 | 8 | 78 0.2564 | 46 | 9 | 80 0.1871 | 47 | 9 | 80 0.1355 | 48 | 9 | 81 0.0976 | 49 | 10 | 82 0.0700 | 50 | 10 | 82 0.0497 | 51 | 10 | 83 0.0353 | 52 | 11 | 84 0.0248 | 53 | 11 | 84 0.0173 | 54 | 12 | 86 0.0121 | 55 | 11 | 85 0.0083 | 56 | 12 | 87 0.0057 | 57 | 13 | 88 0.0039 | 58 | 12 | 87 0.0026 | 59 | 13 | 89 0.0018 | 60 | 14 | 90 0.0012 | 61 | 13 | 89 0.0008 | 62 | 14 | 91 0.0005 | 63 | 14 | 91 0.0003 | 64 | 15 | 92 0.0002 | 65 | 15 | 93 0.0001 | 66 | 15 | 93 0.0001 | 67 | 16 | 94 0.0001 | 68 | 16 | 94 0.0000 | 69 | 16 | 95 0.0000 | 70 | 17 | 97 0.0000 | 71 | 17 | 96 0.0000 | 72 | 18 | 97 0.0000 | 73 | 18 | 99 0.0000 | 74 | 17 | 97 0.0000 | 75 | 19 | 99 0.0000 | 76 | 19 | 100 0.0000 | 77 | 18 | 98 0.0000 | 78 | 20 | 101 0.0000 | 79 | 20 | 101 0.0000 | 80 | 19 | 100 0.0000 | 81 | 20 | 102 0.0000 | 82 | 20 | 103 0.0000 | 83 | 21 | 103 0.0000 | 84 | 21 | 104 0.0000 | 85 | 21 | 104 0.0000 | 86 | 22 | 104 0.0000 | 87 | 22 | 105 0.0000 | 88 | 22 | 105 0.0000 | 90 | 22 | 106 0.0000 | 93 | 23 | 107 0.0000 | 96 | 24 | 108 [/code] [code] 4d6 drop the lowest, sorted by number of points, 0 points for sub-8 stats: st_pc | st_pt | st_m | st_s ----------+-------+------+------ 100.0000 | 14 | 1 | 62 99.9891 | 15 | 1 | 63 99.9205 | 16 | 1 | 63 99.6773 | 17 | 1 | 64 99.0864 | 18 | 1 | 64 97.9732 | 19 | 1 | 65 96.2144 | 20 | 2 | 65 93.7607 | 21 | 2 | 66 90.6571 | 22 | 2 | 66 86.9730 | 23 | 2 | 67 82.7863 | 24 | 2 | 67 78.1886 | 25 | 2 | 67 73.2836 | 26 | 2 | 67 68.1708 | 27 | 3 | 68 62.9516 | 28 | 3 | 68 57.7107 | 29 | 3 | 69 52.5320 | 30 | 3 | 69 47.4779 | 31 | 3 | 70 42.6138 | 32 | 4 | 70 37.9726 | 33 | 4 | 71 33.6070 | 34 | 4 | 71 29.5290 | 35 | 5 | 72 25.7685 | 36 | 5 | 72 22.3289 | 37 | 5 | 73 19.2144 | 38 | 6 | 74 16.4190 | 39 | 6 | 74 13.9374 | 40 | 6 | 75 11.7434 | 41 | 7 | 76 9.8350 | 42 | 7 | 76 8.1732 | 43 | 7 | 78 6.7511 | 44 | 8 | 78 5.5369 | 45 | 8 | 78 4.5092 | 46 | 9 | 80 3.6494 | 47 | 9 | 80 2.9327 | 48 | 9 | 81 2.3394 | 49 | 10 | 82 1.8571 | 50 | 10 | 82 1.4596 | 51 | 10 | 83 1.1434 | 52 | 11 | 84 0.8876 | 53 | 11 | 84 0.6840 | 54 | 12 | 86 0.5254 | 55 | 11 | 85 0.3985 | 56 | 12 | 87 0.3017 | 57 | 13 | 88 0.2266 | 58 | 12 | 87 0.1679 | 59 | 13 | 89 0.1252 | 60 | 14 | 90 0.0913 | 61 | 13 | 89 0.0667 | 62 | 14 | 91 0.0485 | 63 | 14 | 91 0.0344 | 64 | 15 | 92 0.0249 | 65 | 15 | 93 0.0174 | 66 | 15 | 93 0.0122 | 67 | 16 | 94 0.0087 | 68 | 16 | 94 0.0058 | 69 | 16 | 95 0.0041 | 70 | 17 | 97 0.0028 | 71 | 17 | 96 0.0018 | 72 | 18 | 97 0.0013 | 73 | 18 | 99 0.0008 | 74 | 17 | 97 0.0005 | 75 | 19 | 99 0.0004 | 76 | 19 | 100 0.0002 | 77 | 18 | 98 0.0001 | 78 | 20 | 101 0.0001 | 79 | 20 | 101 0.0000 | 80 | 19 | 100 0.0000 | 81 | 20 | 102 0.0000 | 82 | 20 | 103 0.0000 | 83 | 21 | 103 0.0000 | 84 | 21 | 104 0.0000 | 85 | 21 | 104 0.0000 | 86 | 22 | 104 0.0000 | 87 | 22 | 105 0.0000 | 88 | 22 | 105 0.0000 | 90 | 22 | 106 0.0000 | 93 | 23 | 107 0.0000 | 96 | 24 | 108 [/code] [code] 3d6, sorted by number of points, -1 point per step for sub-8 stats: st_pc | st_pt | st_m | st_s ----------+-------+------+------ 100.0000 | 14 | 1 | 62 99.7790 | 15 | 1 | 63 98.6284 | 16 | 1 | 64 95.7917 | 17 | 1 | 64 90.9264 | 18 | 1 | 65 84.1974 | 19 | 1 | 65 76.3813 | 20 | 2 | 66 68.2589 | 21 | 2 | 66 60.1652 | 22 | 2 | 66 52.3084 | 23 | 2 | 67 44.9261 | 24 | 2 | 67 38.1926 | 25 | 3 | 68 32.1762 | 26 | 3 | 68 26.8779 | 27 | 3 | 69 22.2716 | 28 | 3 | 70 18.3142 | 29 | 4 | 70 14.9498 | 30 | 4 | 71 12.1168 | 31 | 4 | 72 9.7524 | 32 | 5 | 72 7.7957 | 33 | 5 | 73 6.1895 | 34 | 5 | 74 4.8816 | 35 | 6 | 75 3.8249 | 36 | 6 | 75 2.9776 | 37 | 7 | 76 2.3032 | 38 | 7 | 77 1.7703 | 39 | 7 | 77 1.3522 | 40 | 8 | 78 1.0264 | 41 | 8 | 79 0.7743 | 42 | 8 | 79 0.5806 | 43 | 9 | 80 0.4326 | 44 | 9 | 81 0.3204 | 45 | 9 | 81 0.2359 | 46 | 10 | 82 0.1726 | 47 | 10 | 83 0.1255 | 48 | 10 | 83 0.0907 | 49 | 11 | 84 0.0652 | 50 | 11 | 85 0.0466 | 51 | 11 | 85 0.0331 | 52 | 12 | 86 0.0233 | 53 | 12 | 86 0.0164 | 54 | 12 | 87 0.0114 | 55 | 13 | 88 0.0079 | 56 | 13 | 88 0.0054 | 57 | 13 | 89 0.0037 | 58 | 13 | 90 0.0025 | 59 | 14 | 90 0.0017 | 60 | 14 | 91 0.0011 | 61 | 14 | 91 0.0008 | 62 | 15 | 92 0.0005 | 63 | 15 | 93 0.0003 | 64 | 15 | 93 0.0002 | 65 | 16 | 94 0.0001 | 66 | 16 | 94 0.0001 | 67 | 16 | 95 0.0001 | 68 | 17 | 95 0.0000 | 69 | 17 | 96 0.0000 | 70 | 17 | 96 0.0000 | 71 | 17 | 97 0.0000 | 72 | 18 | 97 0.0000 | 73 | 18 | 98 0.0000 | 74 | 18 | 99 0.0000 | 75 | 19 | 99 0.0000 | 76 | 19 | 100 0.0000 | 77 | 19 | 100 0.0000 | 78 | 20 | 101 0.0000 | 79 | 19 | 101 0.0000 | 80 | 20 | 101 0.0000 | 81 | 20 | 102 0.0000 | 82 | 20 | 103 0.0000 | 83 | 21 | 103 0.0000 | 84 | 21 | 104 0.0000 | 85 | 21 | 104 0.0000 | 86 | 22 | 104 0.0000 | 87 | 22 | 105 0.0000 | 88 | 22 | 105 0.0000 | 90 | 22 | 106 0.0000 | 93 | 23 | 107 0.0000 | 96 | 24 | 108 [/code] [code] 4d6 drop the lowest, sorted by number of points, -1 point per step for sub-8 stats: st_pc | st_pt | st_m | st_s ----------+-------+------+------ 100.0000 | 14 | 1 | 62 99.9711 | 15 | 1 | 63 99.7878 | 16 | 1 | 64 99.2486 | 17 | 1 | 64 98.1720 | 18 | 1 | 65 96.4416 | 19 | 1 | 65 94.0743 | 20 | 2 | 66 91.1697 | 21 | 2 | 66 87.7763 | 22 | 2 | 66 83.9239 | 23 | 2 | 67 79.6750 | 24 | 2 | 67 75.1108 | 25 | 3 | 68 70.3122 | 26 | 3 | 68 65.3584 | 27 | 3 | 69 60.3289 | 28 | 3 | 70 55.3002 | 29 | 4 | 70 50.3413 | 30 | 4 | 71 45.5126 | 31 | 4 | 72 40.8647 | 32 | 5 | 72 36.4392 | 33 | 5 | 73 32.2691 | 34 | 5 | 74 28.3791 | 35 | 6 | 75 24.7859 | 36 | 6 | 75 21.4985 | 37 | 7 | 76 18.5190 | 38 | 7 | 77 15.8429 | 39 | 7 | 77 13.4608 | 40 | 8 | 78 11.3589 | 41 | 8 | 79 9.5200 | 42 | 8 | 79 7.9244 | 43 | 9 | 80 6.5519 | 44 | 9 | 81 5.3797 | 45 | 9 | 81 4.3885 | 46 | 10 | 82 3.5539 | 47 | 10 | 83 2.8609 | 48 | 10 | 83 2.2847 | 49 | 11 | 84 1.8149 | 50 | 11 | 85 1.4297 | 51 | 11 | 85 1.1199 | 52 | 12 | 86 0.8711 | 53 | 12 | 86 0.6721 | 54 | 12 | 87 0.5162 | 55 | 13 | 88 0.3926 | 56 | 13 | 88 0.2971 | 57 | 13 | 89 0.2235 | 58 | 13 | 90 0.1660 | 59 | 14 | 90 0.1235 | 60 | 14 | 91 0.0904 | 61 | 14 | 91 0.0660 | 62 | 15 | 92 0.0480 | 63 | 15 | 93 0.0342 | 64 | 15 | 93 0.0247 | 65 | 16 | 94 0.0173 | 66 | 16 | 94 0.0121 | 67 | 16 | 95 0.0086 | 68 | 17 | 95 0.0058 | 69 | 17 | 96 0.0040 | 70 | 17 | 96 0.0027 | 71 | 17 | 97 0.0018 | 72 | 18 | 97 0.0013 | 73 | 18 | 98 0.0008 | 74 | 18 | 99 0.0005 | 75 | 19 | 99 0.0004 | 76 | 19 | 100 0.0002 | 77 | 19 | 100 0.0001 | 78 | 20 | 101 0.0001 | 79 | 19 | 101 0.0000 | 80 | 20 | 101 0.0000 | 81 | 20 | 102 0.0000 | 82 | 20 | 103 0.0000 | 83 | 21 | 103 0.0000 | 84 | 21 | 104 0.0000 | 85 | 21 | 104 0.0000 | 86 | 22 | 104 0.0000 | 87 | 22 | 105 0.0000 | 88 | 22 | 105 0.0000 | 90 | 22 | 106 0.0000 | 93 | 23 | 107 0.0000 | 96 | 24 | 108 [/code] And here's the code I used to run the analysis. My running times were on a dual Xeon 2.66Ghz system with 2GB of memory and fast SCSI disks, so it might take a while on something smaller. I think I/O writing out the intermediate tables was the main bottleneck. Oh, also expect to burn a few GB of disk on those tables. The database used was Postgresql 7.4. For another database, you'll almost certainly have to change the code. [code] create table st_pt (n int, pt int); insert into st_pt values (3, 0); insert into st_pt values (4, 0); insert into st_pt values (5, 0); insert into st_pt values (6, 0); insert into st_pt values (7, 0); insert into st_pt values (8, 0); insert into st_pt values (9, 1); insert into st_pt values (10, 2); insert into st_pt values (11, 3); insert into st_pt values (12, 4); insert into st_pt values (13, 5); insert into st_pt values (14, 6); insert into st_pt values (15, 8); insert into st_pt values (16, 10); insert into st_pt values (17, 13); insert into st_pt values (18, 16); -- used in second run: negative point values for low amounts -- insert into st_pt values (3, -5); -- insert into st_pt values (4, -4); -- insert into st_pt values (5, -3); -- insert into st_pt values (6, -2); -- insert into st_pt values (7, -1); -- insert into st_pt values (8, 0); -- insert into st_pt values (9, 1); -- insert into st_pt values (10, 2); -- insert into st_pt values (11, 3); -- insert into st_pt values (12, 4); -- insert into st_pt values (13, 5); -- insert into st_pt values (14, 6); -- insert into st_pt values (15, 8); -- insert into st_pt values (16, 10); -- insert into st_pt values (17, 13); -- insert into st_pt values (18, 16); create table st_mod (n int, m int); insert into st_mod values (3, -4); insert into st_mod values (4, -3); insert into st_mod values (5, -3); insert into st_mod values (6, -2); insert into st_mod values (7, -2); insert into st_mod values (8, -1); insert into st_mod values (9, -1); insert into st_mod values (10, 0); insert into st_mod values (11, 0); insert into st_mod values (12, 1); insert into st_mod values (13, 1); insert into st_mod values (14, 2); insert into st_mod values (15, 2); insert into st_mod values (16, 3); insert into st_mod values (17, 3); insert into st_mod values (18, 4); create table d6 (n int, p float); insert into d6 values (1, 1.0/6.0); insert into d6 values (2, 1.0/6.0); insert into d6 values (3, 1.0/6.0); insert into d6 values (4, 1.0/6.0); insert into d6 values (5, 1.0/6.0); insert into d6 values (6, 1.0/6.0); create table s3d6 (p float, n int, pt int, m int); insert into s3d6 (p, n, pt, m) select sum(a.p * b.p * c.p) as p, (a.n + b.n + c.n) as x, pt, m from d6 a, d6 b, d6 c, st_mod, st_pt where st_mod.n = (a.n+b.n+c.n) and st_pt.n = st_mod.n group by x, pt, m; create table t4d6 (a int, b int, c int, d int, p float); insert into t4d6 select a.n, b.n, c.n, d.n, sum(a.p*b.p*c.p*d.p) from d6 a, d6 b, d6 c, d6 d group by a.n, b.n, c.n, d.n; update t4d6 set a = 0 where a <= b and a <= c and a <= d; update t4d6 set b = 0 where b <= a and b <= c and b <= d; update t4d6 set c = 0 where c <= a and c <= b and c <= d; update t4d6 set d = 0 where d <= a and d <= b and d <= c; create table s4d6 (p float, n int, pt int, m int); insert into s4d6 (p, n, pt, m) select sum(p) as p, (a+b+c+d) as x, pt, m from t4d6, st_mod, st_pt where st_mod.n = (a+b+c+d) and st_pt.n = st_mod.n group by x, pt, m; create table stats3d6 (st_p float, st_pt int, st_m int, st_s int, a int, b int, c int, d int, e int, f int); select 'Started at ' || current_time; insert into stats3d6 (a, b, c, d, e, f, st_p, st_pt, st_m, st_s) select a.n as a, b.n as b, c.n as c, d.n as d, e.n as e, f.n as f, a.p*b.p*c.p*d.p*e.p*f.p as st_p, a.pt + b.pt + c.pt + d.pt + e.pt + f.pt as st_pt, a.m+b.m+c.m+d.m+e.m+f.m as st_m, a.n+b.n+c.n+d.n+e.n+f.n as st_s from s3d6 a, s3d6 b, s3d6 c, s3d6 d, s3d6 e, s3d6 f; select 'Finished at ' || current_time; create table stats4d6 (st_p float, st_pt int, st_m int, st_s int, a int, b int, c int, d int, e int, f int); select 'Started at ' || current_time; insert into stats4d6 (a, b, c, d, e, f, st_p, st_pt, st_m, st_s) select a.n as a, b.n as b, c.n as c, d.n as d, e.n as e, f.n as f, a.p*b.p*c.p*d.p*e.p*f.p as st_p, a.pt + b.pt + c.pt + d.pt + e.pt + f.pt as st_pt, a.m+b.m+c.m+d.m+e.m+f.m as st_m, a.n+b.n+c.n+d.n+e.n+f.n as st_s from s4d6 a, s4d6 b, s4d6 c, s4d6 d, s4d6 e, s4d6 f; select 'Finished at ' || current_time; create table stats3d6l (st_p float, st_pt int, st_m int, st_s int); insert into stats3d6l (st_p, st_pt, st_m, st_s) select sum(st_p), st_pt, avg(st_m), avg(st_s) from stats3d6 where (a > 13 or b > 13 or c > 13 or d > 13 or e > 13 or f > 13) and st_m > 0 group by st_pt; create table stats4d6l (st_p float, st_pt int, st_m int, st_s int); select 'Started at ' || current_time; insert into stats4d6l (st_p, st_pt, st_m, st_s) select sum(st_p), st_pt, avg(st_m), avg(st_s) from stats4d6 where (a > 13 or b > 13 or c > 13 or d > 13 or e > 13 or f > 13) and st_m > 0 group by st_pt; select 'Finished at ' || current_time; -- Normalize create table stats3d6l_norm (st_p float, st_pt int, st_m int, st_s int); insert into stats3d6l_norm (st_p, st_pt, st_m, st_s) select (st_p / (select sum(st_p) from stats3d6l)), st_pt, st_m, st_s from stats3d6l; create table stats4d6l_norm (st_p float, st_pt int, st_m int, st_s int); insert into stats4d6l_norm (st_p, st_pt, st_m, st_s) select (st_p / (select sum(st_p) from stats4d6l)), st_pt, st_m, st_s from stats4d6l; -- And the percentile output select round(cast ((select sum(b.st_p) from stats3d6l_norm b where b.st_pt >= a.st_pt) as numeric)*100.0, 4) as st_pc, st_pt, st_m, st_s from stats3d6l_norm a order by st_pt; select round(cast ((select sum(b.st_p) from stats4d6l_norm b where b.st_pt >= a.st_pt) as numeric)*100.0, 4) as st_pc, st_pt, st_m, st_s from stats4d6l_norm a order by st_pt; [/code] [/QUOTE]
Insert quotes…
Verification
Post reply
Community
General Tabletop Discussion
*TTRPGs General
25 or 32...what's the REAL "standard" point buy?
Top