私は小説を書いているのですが、とある本でカードを利用した物語作成術が載っておりました。そこで、これを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)) ); }