Last active
December 22, 2015 07:17
-
-
Save koolii/7d7eba609f0e2eeeb3d0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 基本 | |
// どのくらいの数をどの段階に分けるのか指定し、振り分ける | |
// 応用 | |
// 最低限ここまでは値が合ったほうが良い | |
// 最高でもここまでの値で良い | |
/* | |
下記を目指す。 | |
createParagraph(70, 5); | |
-> 5,3%,9,7%,....,70,100% | |
createParagraphs("own", 70, 7); | |
今年,6,0.3%,13,0.7%,10,0.5%,13,0.7%,12,0.6%,12,0.6%,4,0.2%,70,100.0% | |
前年,3,0.1%,7,0.4%,13,0.7%,13,0.7%,12,0.6%,14,0.7%,8,0.4%,70,100.0% | |
前々年,4,0.2%,12,0.6%,13,0.7%,13,0.7%,10,0.5%,14,0.7%,4,0.2%,70,100.0% | |
*/ | |
function createParagraphs(sum, _class, obj) { | |
var params = { | |
pattern: ["default", "sorted", "alpha_all"], // CSVの書き出し | |
header: { | |
"past": ["今年", "前年", "前々年"], | |
"before": ["今回", "前回", "前々回"] | |
} | |
}; | |
// 設定:CSV出力方法 | |
if (obj.pattern == undefined) { | |
obj.pattern = params.pattern[0]; | |
} | |
// 設定:ヘッダー | |
if (obj.type == "past" || obj.type == "before") { | |
obj.header = params.header[obj.type]; | |
} else if (obj.header === undefined) { | |
obj.header = params.header["past"]; | |
} | |
var textArray = []; | |
for (var headerIdx in obj.header) { | |
var text = createParagraph(sum, _class, obj.pattern); | |
textArray.push(obj.header[headerIdx] + "," + text); | |
} | |
return textArray.join("\n"); | |
} | |
function distribution(sum, _class) { | |
var cpSum = sum; | |
var result = []; | |
// 初期値を代入(合計値の内2割を初期として代入) | |
var iniVal = Math.floor(sum / 10); | |
for (var i=0; i<_class; i++) { | |
if (i != 0 && i != _class-1) { | |
result[i] = iniVal; | |
cpSum -= iniVal; | |
} else { | |
result[i] = 0; | |
} | |
} | |
// 残った合計値で分類の範囲内で乱数を作成し、所属させていく | |
for (var i=0; i<cpSum; i++) { | |
result[rand(1, _class) - 1]++; | |
} | |
return result; | |
} | |
// 指定した範囲までの乱数を生成 | |
function rand(low, up) { | |
return low + Math.floor(Math.random() * up); | |
} | |
// 各段階への所属の合計を算出 | |
function calcSum(category) { | |
var sum = 0; | |
category.forEach(function(ele) { | |
sum += ele; | |
}); | |
return sum; | |
} | |
// 各段階に所属している値から割合を算出 | |
function calcPercentage(category, _class) { | |
return ((category[_class]/calcSum(category)) * 100).toFixed(1) + "%"; | |
} | |
// 作成したデータを元にカンマ区切りの一行を作成 | |
function createParagraph(sum, _class, pattern) { | |
var result = []; | |
var category = distribution(sum, _class); | |
if(pattern == "sorted") { | |
// 人数を先に全て出力後、紐付く割合を全て出力 | |
for (var i=0; i<_class; i++) { | |
if (category[i] == undefined) { | |
result.push("0"); | |
} else { | |
result.push(category[i]); | |
} | |
} | |
result.push(sum); | |
for (var i=0; i<_class; i++) { | |
if (category[i] == undefined) { | |
result.push("0"); | |
} else { | |
result.push(((category[i]/sum) * 100).toFixed(1) + "%"); | |
} | |
} | |
result.push("100.0%"); | |
} else if(pattern == "alpha_all") { | |
// 全体で合計しなければならないパターン | |
} else { | |
// default | |
for (var i=0; i<_class; i++) { | |
result.push(category[i]); | |
result.push(((category[i]/sum) * 100).toFixed(1) + "%"); | |
} | |
result.push(sum); | |
result.push("100.0%"); | |
} | |
return result.join(","); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment