Skip to content

Instantly share code, notes, and snippets.

@koolii
Last active December 22, 2015 07:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koolii/7d7eba609f0e2eeeb3d0 to your computer and use it in GitHub Desktop.
Save koolii/7d7eba609f0e2eeeb3d0 to your computer and use it in GitHub Desktop.
// 基本
// どのくらいの数をどの段階に分けるのか指定し、振り分ける
// 応用
// 最低限ここまでは値が合ったほうが良い
// 最高でもここまでの値で良い
/*
下記を目指す。
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