乱数でアイデアを生成する

![20181224-203014-132.png](https://qiita-image-store.s3.amazonaws.com/0/30255/92532067-40ab-1db7-1a5f-2839ea5170d3.png)
[U-17 未踏ジュニアアドベントカレンダー 2018](https://adventar.org/calendars/3556), 24 日目の記事です。
新しいアイデアをプログラムで作る方法を紹介します。

# 説明
それなりにプログラミングができて、作ってみたいアプリやサービスもあるけれど、オリジナリティのあるアイデアが思いつかないことはよくあります。そんなときは乱数で発想のヒントを生成してみると、これまでの常識を打ち破るようなアイデアを生み出せるかもしれません。

# 準備
準備するのは 4 つのリスト（テキストファイル）です。

#### A. 作ってみたいアプリケーションリスト
自分が作ってみたい、もしくは作れそうなアプリを列挙します。

- カレンダーアプリ
- 観光案内アプリ
- チャットサービス

#### B. 目標リスト
達成すると良さそうなことを列挙します。
A の内容はいったん忘れて、良さそうなイメージの文章を書いていきます。

- 失敗しないように
- 探すのが簡単になるように
- 子どもでも使えるように

#### C. 着眼点リスト
実装を工夫する箇所を列挙します。自分の得意な技術を盛り込むとよいでしょう。

- 履歴を
- 画像を
- 検索を

#### D. アクションリスト
具体的な実装のアクションを列挙します。動詞で書きます。

- 共有する
- くりかえす
- 大きくする

# 実装
あとは A,B,C,D のリストからランダムにアイテムを 1 つずつ選択し、つなげて表示するだけです。
リストの例と、生成した結果から新しいアイデアを生み出す流れを見てみましょう。

```applications.txt
カレンダーアプリ
観光案内アプリ
チャットサービス
音楽プレイヤー
電卓アプリ
タスク管理アプリ
プログラミング学習サービス
翻訳サービス
「あとで読む」リスト
録音アプリ
時計アプリ
歩数計アプリ
```

```targets.txt
失敗しないように
探すのが簡単になるように
子どもでも使えるように
すぐに使えるように
どんなときでも使えるように
お年寄りが安心して使えるように
使っていて楽しくなるように
友達と共有したくなるように
SNSで紹介したくなるように
使っていて知識が増えるように
リラックスして使えるように
上級者がカスタマイズできるように
ゲーム感覚で使えるように
面倒にならないように
おしゃれになるように
無駄遣いしないように
忘れないように
```

```objects.txt
履歴を
画像を
検索を
アニメーションを
文字を
タッチを
移動を
選択を
画面を
効果音を
まわりを
裏側を
途中経過を
全部を
最初を
最後を
予測を
修正を
グラフを
比較を
```

```actions.txt
共有する
くりかえす
大きくする
小さくする
早くする
スキップする
丁寧にする
見せる
見せない
消去する
減らす
増やす
比較する
つなげる
自動にする
保存する
アニメーションさせる
簡単にする
確認する
```

これらのファイルを読み込んで、ボタンを押すたびに新しい生成結果を表示するアプリを C++/Siv3D で書きました。仕組みは簡単なので、自分の得意な言語で実装してみると良いでしょう。

```siv3d.cpp
# include <Siv3D.hpp> // OpenSiv3D v0.3.1

Array<String> ReadCards(const FilePath& path)
{
	return TextReader(path).readAll().split_lines();
}

void Main()
{
	// 背景色と文字
	Window::Resize(800, 350);
	Graphics::SetBackground(ColorF(0.8, 0.9, 1.0));
	const Font font(40, Typeface::Bold), fontSmall(20);

	// ファイルからアイテムを読み込む
	const Array<String> applications = ReadCards(U"applications.txt");
	const Array<String> targets = ReadCards(U"targets.txt");
	const Array<String> objects = ReadCards(U"objects.txt");
	const Array<String> actions = ReadCards(U"actions.txt");
	String application, target, object, action;

	// 何パターン作れるかを計算 (A の個数 x B の個数 x C の個数 x D の個数)
	const size_t patterns = (applications.size() * targets.size() * objects.size() * actions.size());

	while (System::Update())
	{
		// Update ボタンを押したら再生成
		if (SimpleGUI::Button(U"Update", Vec2(20, 280)))
		{
			application = applications.choice();
			target = targets.choice();
			object = objects.choice();
			action = actions.choice();
		}

		// 結果を表示
		font(U"テーマ: ", application).draw(20, 20, ColorF(0.25));
		font(target).draw(20, 80, ColorF(0.25));
		font(object).draw(20, 140, ColorF(0.25));
		font(action).draw(20, 200, ColorF(0.25));
		fontSmall(U"アイデアパターン: {} x {} x {} x {} = {}"_fmt(
			applications.size(), targets.size(), objects.size(), actions.size(), patterns))
			.draw(160, 285, ColorF(0.25));
	}
}
```

# 生成結果からアイデアを作る
ランダムに生成された結果から、具体的なアプリやサービスを考えてみましょう。

## その 1
![20181224-203014-132.png](https://qiita-image-store.s3.amazonaws.com/0/30255/92532067-40ab-1db7-1a5f-2839ea5170d3.png)
授業や会議を録音して、後で見返したときにどのファイルが目的のものかわからなくならないように、録音時に、その場所の動画や写真を撮影しておくとサムネイル画像で表示してくれるアプリ。

## その 2
![20181224-203147-674.png](https://qiita-image-store.s3.amazonaws.com/0/30255/d5a7c0a4-150e-df05-d04d-54beec37f3ee.png)
ウォーキングの記録を開始するときに、わざわざアプリを起動しなくて済むように、端末をシェイクすると自動で記録を開始する機能。

## その 3
![20181224-203215-372.png](https://qiita-image-store.s3.amazonaws.com/0/30255/c209159b-6cc1-37e7-7f45-56b306a98198.png)
フラッシュ暗算モードを搭載する電卓・・・？

## その 4
![20181224-203251-700.png](https://qiita-image-store.s3.amazonaws.com/0/30255/3bb3f887-7cb1-2252-516b-50848582c700.png)
5
+
2
×
10
と入力したときに、(5+2)*10 = 70 になってくれる電卓アプリ。
すでに多くの電卓アプリに実装されてるようなのでボツ。

## その 5
![20181224-203505-928.png](https://qiita-image-store.s3.amazonaws.com/0/30255/8eae614f-2a33-de17-63ca-31d554a0d6ea.png)
混雑する観光名所を訪れてその場所の詳しい情報を知りたいときに、カメラで対象を認識させれば情報が得られる機能。

## その 6
![20181224-203559-283.png](https://qiita-image-store.s3.amazonaws.com/0/30255/167c204c-fbb1-8f6e-2f01-827836599f54.png)
なるべく短い単語や文章で乗り切れるような旅行英会話を提案してくれるアプリ。

## その 7
![20181224-220353-434.png](https://qiita-image-store.s3.amazonaws.com/0/30255/d6a18f6f-fc65-5128-d944-cbb6487ad8e0.png)
翻訳結果を相手に見せるとき、端末を回転させなくても済むよう、文章を上下反転して表示する機能。

## その 8
![20181224-220816-956.png](https://qiita-image-store.s3.amazonaws.com/0/30255/97eb2e2a-9d10-6aaf-b733-5c7882864cc3.png)
本当に計測できているのか不安なお年寄りのために、歩数カウントの効果音が鳴る歩数計アプリ。

## その 9
![20181224-221529-225.png](https://qiita-image-store.s3.amazonaws.com/0/30255/bd8676f7-71b8-265e-72d3-d13bc16a1af5.png)
原稿や卒論の進捗を、毎日カレンダーを埋めていく形式で友達と共有するアプリ。

## その 10
![20181224-221923-573.png](https://qiita-image-store.s3.amazonaws.com/0/30255/6772d54a-c858-ad45-01da-48838c0db6b1.png)
久しぶりに連絡を取ろうとした相手との最後のチャット履歴が気まずい内容で、メッセージを送るのをためらってしまうことを回避できる、履歴クリーンアップ機能を搭載したチャットサービス。

# まとめ
このように、乱数によるアイデア生成を使うと、短時間でたくさんの企画を考えることができます。
A, B, C, D のリストには、それぞれ前後の整合性を気にせず、日常で気付いた・思いついたネタをどんどん取り込んでいきましょう。例えば、あるメールサービスを使っていて、返信忘れを通知してくれる機能を発見したとします。ここから「B: 忘れないように」「D: 確認する」という要素を抽出してリストに加えることができます。こうして自分だけのリストを成長させていけば、生成可能パターンは数万～数十万通り以上に広がります。

#### 参考
- [アイデアカード](https://www.ideacard.jp/about.html)