私は小説を書いているのですが、とある本でカードを利用した物語作成術が載っておりました。そこで、これをCで実現しようと思い、取り組んでいるのですが行き詰まりました……。
乱数を発生させる方法は分かったのですが、以下のプログラムでは結果が重複してしまって、同じものを二回引くという矛盾が生じてしまいます。
この矛盾を無くしたいのですが、何か良い案はありませんでしょうか?
/*************************
物語作成お助けプログラム
*************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 24
// 関数のプロトタイプ
int GetRandom(int min, int max);
int main(void) {
char rune[NUM][128] = { {"知恵"}, {"生命"}, {"信頼"}, {"勇気"},
{"慈愛"}, {"秩序"}, {"至誠"}, {"創造"},
{"厳格"}, {"治癒"}, {"理性"}, {"節度"},
{"調和"}, {"結合"}, {"庇護"}, {"清楚"},
{"善良"}, {"解放"}, {"変化"}, {"幸運"},
{"意思"}, {"誓約"}, {"寛容"}, {"公式"} };
int i, n;
srand( (unsigned int)time(NULL) );
for (i = 0; i < 6; i++) {
n = GetRandom(0, NUM - 1);
switch (i) {
case 0: printf(" 主人公の現在―――〉"); break;
case 1: printf(" 主人公の近い未来―〉"); break;
case 2: printf(" 主人公の過去―――〉"); break;
case 3: printf(" 援助者――――――〉"); break;
case 4: printf(" 敵対者――――――〉"); break;
case 5: printf(" 結末(目的)―――〉"); break;
}
printf("%s", rune[n]);
if ( GetRandom(0, 1) ) {
printf("<逆>");
}
printf("\n");
}
return (0);
}
// 範囲乱数を実現する関数
int GetRandom(int min, int max) {
return ( min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)) );
}