2016-10-07 2 views
0

私は、毎正午まで毎時確率を増やして、真夜中まで確率を下げて実行したいという機能を持っています。私は正午に中心を置く正規分布がそれを行うと想像することができます(関数を実行する確率は正午に100%ですが深夜には非常に低くなります)。しかし、Pythonコードに変換することはできません。時間ベースで確率的に実行中

例えば、コードが午前1時に実行されると、実行する確率は非常に低くなります。しかし、コードが正午に実行されると、実行可能性は100%になります。

currentHour = 12 

if currentHour == 1: 
    print('probability = 0') 
elif currentHour == 2: 
    print('probability = 0') 
elif currentHour == 3: 
    print('probability = .1') 
elif currentHour == 4: 
    print('probability = .2') 
elif currentHour == 5: 
    print('probability = .3') 
elif currentHour == 6: 
    print('probability = .4') 
elif currentHour == 7: 
    print('probability = .5') 
elif currentHour == 8: 
    print('probability = .6') 
elif currentHour == 9: 
    print('probability = .7') 
elif currentHour == 10: 
    print('probability = .8') 
elif currentHour == 11: 
    print('probability = .9') 
elif currentHour == 12: 
    print('probability = 1') 
elif currentHour == 13: 
    print('probability = .9') 
elif currentHour == 13: 
    print('probability = .8') 
elif currentHour == 14: 
    print('probability = .7') 
elif currentHour == 15: 
    print('probability = .6') 
elif currentHour == 16: 
    print('probability = .5') 
elif currentHour == 17: 
    print('probability = .4') 
elif currentHour == 18: 
    print('probability = .3') 
elif currentHour == 19: 
    print('probability = .2') 
elif currentHour == 20: 
    print('probability = .1') 
elif currentHour == 21: 
    print('probability = 0') 
elif currentHour == 22: 
    print('probability = 0') 
elif currentHour == 23: 
    print('probability = 0') 
elif currentHour == 24: 
    print('probability = 0') 
+1

最低限、辞書を使用してください。 –

+0

.1で上下するのではなく、Box-Mueller変換を使って正規分布にすることができます。 http://stackoverflow.com/a/75720/509840の回答を参照してください。または、Wikipediaのページ(変換可能なコードあり)をhttps://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform – rajah9

+0

@ rajah9で見ることができます。この式はsin()を使用しています。与えた。 – Fusseldieb

答えて

1

ピュアマジック:

これは私が欲しいもので、完全に、粗、unpythonic、手動の試みです。私はそれを考え出した。いいえ、ちょうど冗談です。あなたがその質問をしたとき、それはすぐに鼻洞の波を思い出させ、彼らはあなたがやろうとしているもののように、再び上ってから下に行く。

thisページによれば:

Y =罪Xによって定義された関数のグラフは正弦波または正弦波と呼ばれます。 [...]このグラフは、6.28単位または2 piラジアンごとに繰り返されます。それは、だから私はこの思い付いたから-1 1

の範囲:

sin((hour/24)*pi) 

次のようなpythonでこれを統合することができます。

import math 
import time 
hour = int(time.strftime("%H")) 
probability = math.sin(hour/24.0*math.pi) 
print(probability) 

なぜ? sin(0*pi)は0です。sin(0.5*pi)1です。あなたは12時間で確率が最高であることを望んでいるので、1です。この値はsin(0.5*pi)で発生します。 24時間後に値はsin(1*pi)となり、もう一度0になります。

そしてIは24によって現在の時間を分割して、024に、0から1の範囲その値を変換しました。オプションの

Half sine

1

たくさん。ちょうど時間に基づいて0と1の間の値を返す関数を作る。次に、0と1の間のランダムな浮動小数点数を作ります。浮動小数点数が確率よりも小さい場合は、プログラムを実行します。

import numpy as np 

def prob_sawtooth(hour): 
    return 1. - abs((hour - 12.)/12.) 

def prob_sin(hour): 
    return np.sin(hour/24. * np.pi) 

def prob_gaussian(hour, stdev=6.): 
    gauss = lambda x, m, s: np.exp(-(x-m)**2/(2*s**2))/np.sqrt(2*np.pi*s**2) 
    return gauss(hour, 12., stdev)/gauss(12., 12., stdev) 

test = np.random.rand() 
#14:00 
if test <= prob_gaussian(14.): 
    # run program 
    pass 
関連する問題