Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let chanceToRoll = [0.074409, 0.101869, 0.165654, 0.275538, 0.030763, 0.330264, 0, 0.021503];
- let nothingObtained = [0, 0, 0, 0, 0, 0, 0, 0];
- function equals (a, b) {
- for (let i = 0; i < 8; ++i)
- {
- if (a[i] != b[i]) return false;
- }
- return true;
- }
- function available(state, total) {
- let available = total;
- for (let i = 0; i < 8; ++i)
- {
- available -= (i + 1) * state[i];
- }
- return available;
- }
- function addToData(currentData, pair) {
- for (let index = 0; index < currentData.length; ++index) {
- if (equals(currentData[index][0], pair[0])) {
- currentData[index][1] += pair[1];
- return;
- }
- }
- currentData.push(pair);
- }
- function calculate(startingPoints, runUntil, rank) {
- let data = [[nothingObtained, 1]];
- for (let total = startingPoints + 1; total <= runUntil; total++) {
- let newData = [];
- for(let pair of data) {
- let state = pair[0];
- let baseChance = pair[1];
- let toSpend = available(pair[0], total);
- for (let index = 0; index < toSpend; index++) {
- let newState = pair[0].slice(0, 8);
- newState[index]++;
- addToData(newData, [newState, baseChance * chanceToRoll[index]]);
- }
- let chanceToMiss = baseChance * chanceToRoll.slice(toSpend, 8).reduce((a, b) => a+b, 0);
- if (chanceToMiss > 0) {
- addToData(newData, [state, chanceToMiss]);
- }
- }
- data = newData;
- }
- let chanceToObtain = 0;
- for(let pair of data) {
- let state = pair[0];
- let chance = pair[1];
- if (state[rank - 1] > 0) {
- chanceToObtain += chance;
- }
- }
- return chanceToObtain;
- }
- function makeTable(startingPoints, rolls) {
- const output = [];
- for (let roll = 1; roll <= rolls; roll++) {
- for (let rank = 1; rank <= 8; ++rank) {
- output.push(calculate(startingPoints, startingPoints + roll, rank) + '\t');
- }
- output.push('\n');
- }
- return output.join('');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement