↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > ランダムに分散する

ランダムに分散する

100あるものを微妙にちらして分割する関数が必要だったのですが、なかったので自作してみました(randiなのかな?)。例えば、100を4つにわけるときに、 25 の4つではなくて、23, 21,17,19 の様に微妙にずれた結果を配列で返す処理です。ソース汚い、、、、。本当は数学で正しい取得方法が あるのかと思いますが、よくわかりませんのでゴリゴリ作成。

参考:指定の平均値と分散をもつ正規分布からの乱数
参考:乱数配列の作成
参考:randi

やってみた

以下関数を実行すると、適当に分散された数値の結果が帰ってきます。



 let divArr:Array = self.devideRandom(300, split: 8, yurep: 5);

 // ランダムに分散する関数
 // target = ターゲットになる元の数字
 // split = 分散する値
 // yurep = ずらすパーセント 0~ 100 %
 func devideRandom(target:Int, split:Int, yurep:Int)->Array{
        
        
        var _total = target;
        var _retArr:Array = Array();
        let _yure = Int( _total / split) * yurep/100;
        let _yuragi:Int = Int(_total / split / _yure);
        let _lastIndex:Int = split-1;
        
        for (var i=0;i < split; i++){
            
            if (i == _lastIndex){
                _retArr.append(_total);
                break;
            }
            
            let _standard = _total/(split-i);
            let _randInt:UInt32 = arc4random_uniform(UInt32(_yuragi));
            let _onoff:UInt32 = arc4random_uniform(2);// + か マイナスか
            
            var ret:Int = 0;
            if (_onoff % 2 == 0){
                ret = _standard + Int(_randInt);
            }else{
                ret = _standard - Int(_randInt);
            }
            
            _retArr.append(ret);
            _total = _total - ret;
            
        }
        
        return _retArr;
    }

 print (divArr);
 以下のような感じに出力されました。
 8
20
67
75
35
14
22
59
 

↓ yure引数を100にした場合(ゆれていない)の配列で分散した場合

サンプル画像

↓ yurep引数を5にした場合(ゆれてる)の配列で分散した場合

サンプル画像

まとめ

人様に見せることができない汚いソースでスイマセン、、、改善してまいります。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!