🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

1009閲覧

Seed値によるランダムな数学関数の生成

Kashi_wamochi

総合スコア14

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/01/04 11:08

iOSでのアプリ開発を検討しているものです。
現在、生成したランダム値からランダムな数学関数を生成するアルゴリズムを実装したいと考えております。
最終的にはその関数を画面上にx-yグラフとして描画させる予定です。

生成したい数学関数はlogやexp、絶対値と多項式の組み合わせなどを考えております。例としては以下のような関数です。
関数の例
一応以下のような処理は考えたのですが、if処理内に記述した各項の線形結合でしか関数が表現できず、どうしたらよいのかと悩んでおります。
何か良い方法ありましたら、教えていただけると助かります。

Swift

1let seed = Double(arc4random_uniform(UInt32.max))/Double(UInt32.max - 1) 2 3func functionGenerator (Double x, Double Seed) -> Double{ 4 var tmp = 0.0 5 if (Seedに関する条件1) { 6 tmp += x 7 } 8 if (Seedに関する条件2) { 9 tmp += pow(x, 2) 10 } 11 if (Seedに関する条件3) { 12 tmp += pow(M_E, x) 13 } 14 ... 15 return tmp 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

swift

1import Foundation 2precedencegroup Composition { 3 associativity: right 4 lowerThan: BitwiseShiftPrecedence 5} 6infix operator~>: Composition 7func ~>(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double { 8 return {(x: Double) in f(g(x))} 9} 10func +(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double { 11 return {(x: Double) in f(x) + g(x)} 12} 13func -(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double { 14 return {(x: Double) in f(x) - g(x)} 15} 16func *(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double { 17 return {(x: Double) in f(x) * g(x)} 18} 19func /(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double { 20 return {(x: Double) in f(x) / g(x)} 21} 22 23func functionGenerator(_ seed: Int, _ depth: Int = 0) -> (Double) -> Double { 24 if (depth == 10) {return {$0}} 25 if (/*condition 1*/) { 26 /*本当はseedを変えて再帰すべき*/ 27 return functionGenerator (seed, depth + 1) + functionGenerator (seed, depth + 1) 28 }else if (/*condition 2*/) { 29 return functionGenerator (seed, depth + 1) * functionGenerator (seed, depth + 1) 30 }else if (/*condition 3*/) { 31 return log ~> functionGenerator (seed, depth + 1) 32 }else if (/*condition 4*/) { 33 return sqrt ~> functionGenerator (seed, depth + 1) 34 }else { 35 return abs ~> functionGenerator (seed, depth + 1) 36 } 37}

コードがSwiftになってたので一応Swiftで書いてみました。
だいぶ細かい部分は省略してるのでわかりづらいとは思いますが、こんな感じで再帰的にジェネレーターを呼び出して、合成すると複雑な関数になると思います。
関数を返すのではなく具体的なxの値で計算させる場合も、同様に再帰的に計算させれば同じことができます。

投稿2020/01/04 15:24

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例えば、こんなのはいかがでしょうか?

  1. seedで乱数を初期化する。
  2. 1から10までの整数乱数を出す。(例えば7が出る)
  3. 7個の項を生成する。各項がxとなる確率は1/2、それ以外の-10から10までの乱数となる確率は1/2

例: x 7 3 x -9 x 4
4. その後、7-1個の2項演算子を、逆ポーランド記法を守るように配置する
例: x 7 + 3 * x -9 / pow x * 4 +
5. 最後に、任意の位置に単項演算子を挿入する。
例: x 7 + 3 exp * x -9 / pow x abs * 4 +
6. 計算する
例: ((x+7)(e^3))^(x/(-9))|x|+4

投稿2020/01/04 14:01

majiponi

総合スコア1722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kashi_wamochi

2020/01/05 04:17

とても分かりやすい回答ありがとうございます! 逆ポーランド記法は聞いたことがありましたが、こういった活用法もあるのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問