生成AIを活用したSaaSサービス提供企業

  • Company
    • Company
    • 会社概要
    • グループ会社
  • Service
  • Work
  • News
  • Recruit
  • Blog
  • Contact

ブログBlog

  • ALL

  • お知らせ

  • 技術/デザイン/制作

  • ベトナム

  • ごはん

  • 日常/プライベート

  • ああ素晴らしき乱数の世界

    乱数とは?世の中の予測できない色々のこと。

    土日はゲーム制作に勤しむ私ですが、ゲームと切っても切れない関係なのが乱数。ガチャを回したり、敵を出現させたり、カードをシャッフルしたりいろんな場面で使います。

    いろいろ奥が深いのですが、乱数って楽しいよ!
    ということを語っていきます。

    用語説明

    乱数

    人の手で操作できない、他の事象と関連がない、予測のできない数のこと。

    真の乱数

    自然界に存在する乱数。
    水の流れる様子や、木の葉のこすれる音、星のきらめきなどのこと。

    疑似乱数

    コンピュータで生成する乱数。
    計算によって作り出されているので、一見バラバラだが実は予測することができる。

    シード値

    疑似乱数を作る時に使う、元となる数字。
    シード値が同じなら常に同じ乱数が作られる。
    シードは種の意味。

    「シード」は開発者ならよく聞く言葉ですよね。

    真の乱数を求めて ~粒子編~

    粒子が動くときはランダムウォークという性質があるらしく、それゆえ自然界には完全な真の乱数があるといえそうです。

    ※酔っ払いみたいにふらふら動くので日本語で「酔歩」とも。他にもブラウン運動というのもあるらしい。

    この性質を利用した乱数生成器も売られています。
    仕組みは超簡単で、真ん中に向かって粒子を飛ばして

    Aの板に当たれば0、Bの板に当たれば1とすればいいわけです。
    粒子1個で1ビットですから、64ビットの乱数が欲しければ64個粒子を飛ばせばいいわけですね。

    他にも、粒子の「電子なだれ」という性質を利用した乱数生成器もあり、8千円ぐらいで買えます。

    8千円で真の乱数が買えるなら安いものだと思いますが、みなさんはどう思われますか?

    真の乱数を求めて ~アルゴリズム編~

    続いて、もう少し我々に馴染みのある話を。

    疑似乱数はほとんどの開発言語に標準装備されていますが、採用しているアルゴリズムはまちまちです。
    代表的なアルゴリズムは3つ。

    線形合同法

    C言語、Java

    メルセンヌツイスタ

    php、python、Ruby

    Xorshift

    JavaScript(Chrome)

    (ただし、JavaScriptで乱数をどのように実装するかはブラウザに委ねられているので、
    Chrome以外のブラウザでどのように実装されているかはわかりませんでした。)

    自分の使っている言語のアルゴリズムが気にくわなければ、好きなものを実装すればいいと思います。
    それぞれの数式は、ネットを探せば見つかります。

    Javaと乱数

    線形合同法は古いアルゴリズムで、生成される乱数に偏りがあるらしいです。
    (過去にはサイコロゲームのサイコロで奇数しか出なかったとかなんとか・・)

    Javaはモダン言語(?)なのに線形合同法を使っているため開発者から白い目で見られていますが、
    私は今までずっと使っていて特に不便を感じたことはないです。

    使うときは次のことに留意すればいいと思います。
    1.むやみにランダマイズしない。(1回の起動あたり1回でOK)
    2.最初の1回は捨てる。(米を砥ぐときは最初の水は捨てますよね。それと同じです。)

    ただし、暗号化などで使うのはやめましょうね。

    乱数のコクとは!?

    で、ここまでの話は余談で、
    乱数をどのように使うのか?というのがゲームの面白さを左右する重要なポイントになります。

    生成した疑似乱数は、全ての値の出る確率が均一なので、機械的な印象になるんですね。
    適度加工することによって、自然な乱数に感じるというわけです。

    これを「乱数にコクを出す」といいます。

    正規乱数

    正規乱数(正規分布)は、自然界によく見られる乱数です。

    ダーツをイメージすればわかると思いますが、
    中心を狙って何本も投げると、中心に近くなるほどダーツが集中しますよね。

    それを再現できるのがこちらのコード。

    final int DICE = 5;
    
    double d = 0;
    for(int i=0; i<DICE; i++) {
        d += Math.random();
    }
    return d / DICE;

    DICEの数を増やすほど中心に偏り、少なくするほどバラバラになります。
    TRPG(ボードゲームの一種)で遊んだことがある人はピンとくる乱数ではないでしょうか。

    ブラウンノイズ

    全ての値の出る確率が一定である「ホワイトノイズ」に対し、
    入力値が高ければ高いほど高い結果が得やすくなる乱数をブラウンノイズといいます。

    ブラウンノイズにはいろいろな数式が考えられますが、こういうのはどうでしょうか?

    double input = 10.0;  //入力値
    
    final double RATE = 0.5;  //定数
    
    return input * (1 - RATE + (RATE * 2 * Math.random()));

    攻撃力10のキャラクターが敵に攻撃した場合に与えるダメージをイメージしてみました。
    攻撃力に比例して、最大±50%のゆらぎがあります。
    Math.random()の部分を正規乱数にすればいい感じの乱数になりそうです。

    ピンクノイズ

    ピンクノイズはブラウンノイズと同様に、入力値が大きいほど大きい結果が得られますが、
    大きい数字が得られる確率がすごく少ないという特徴があります。

    特に決まった数式はないのですが、私が自分で作った数式を特別に公開しちゃいます。

    double input = 1.05;//入力値
    
    final double BREAK_RATE = 0.14;//定数
    final double UP_RATE = 1.2;//定数
    
    double d = 1;
    while (true) {
        if (Math.random() < BREAK_RATE) {
            break;
        }
        d *= UP_RATE;
    }
    return input * d;

    この数式を使うと非常に中毒性の高いゲームになるので、法律で規制した方がいいのでは?
    と思うほどです。(自画自賛ジョーク)

    なお、数値の上限がないため、
    オーバーフローが気になる方はwhileの条件式を調整すれば問題ありません。

    パーリンノイズ

    今一番気になるのはこれ!

    グラフィックの世界で自然現象を再現するのによく使われるのが「パーリンノイズ」。
    マインクラフトの地形生成にも使われているそうです。

    パーリンノイズで作られた水面。やばい。

    パーリンノイズを覚えれば、3Dモデルが作れなくてもリッチな3Dゲームが作れるかも!
    ・・と思うと夢が広がりますね~。

    最後に

    この記事の説明には聞きかじった情報と超訳が混ざっているのでご注意ください。
    へーそーなんだー、ぐらいにとどめといてください!

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    アバター投稿者 staff

    投稿日: 2019/06/052024/04/26

    カテゴリー 技術 / デザイン / 制作
  • 家じゃ勉強に集中できない。それなら・・・

    こんにちは、制作部 夏目です。

    ブログアワード(会社内でブログのPV数が一定数以上の記事を書いた人にギフト券をプレゼントする制度)
    が、単発記事ではなく、その人が月内に書いた記事のPVの累計で決まると知って、それならできるんじゃね?と思っている今日この頃です。

    さて、この時期になると、中学生や、高校生、大学生はテストの時期ですね。
    自分も昔、受けました(結果はあえて言わない)が、家だと集中できないと言う方多いんじゃないでしょうか。

    これは学生に限った話ではなく、社会人の皆さんも勉強しようと思っても家だと誘惑(色々な)がいっぱいあって集中できないと言う方は多いはず。

    そこで、今日はそんな皆さんにぴったりの勉強場所を教えたいと思います。
    “家じゃ勉強に集中できない。それなら・・・” の続きを読む

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    アバター投稿者 staff

    投稿日: 2019/06/052024/04/23

    カテゴリー 技術 / デザイン / 制作
  • カーニングしてますか?

    こんにちは。制作部の橘野です。

    個人的にデザインする上で大事にしてるのはバランス!

    その中でカーニングも細かいところですが重要なポイントです。

    “カーニングしてますか?” の続きを読む

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    橘野茜投稿者 橘野茜

    投稿日: 2019/04/19

    カテゴリー 技術 / デザイン / 制作
  • ゲーム感覚でデザイン感覚を学べるサイトで遊んでみる

    こんにちは、制作部の稲葉です。

    先日カーニングをゲーム感覚で学べるサイトを知ったのですが、
    他にも何かないか探してみました。
    今回はデザインについてゲーム感覚で学べるサイトをいくつか紹介させていただきます。

    “ゲーム感覚でデザイン感覚を学べるサイトで遊んでみる” の続きを読む

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    稲葉彩乃投稿者 稲葉彩乃

    投稿日: 2019/04/032019/04/03

    カテゴリー 技術 / デザイン / 制作
  • XMLHttpRequestでWatson Assistantを使おうとして失敗した話

    こんにちはー。

    バーチャルYoutuber(Vtuber)を担当する声優さんのことを業界用語で魂(たましい)というらしいですよ。

    へー。

    神尾です。

    WebサイトにWatson Assistantを組み込むぞい

    今回はWebサイトにチャットボットを組み込む話。
    いつも弊社製品のFirstContactを使ってチャットボットを作っているのですが、今回は自分で頑張ってみたいと思います。
    チャットボット本体(魂といえるかもしれない)は以前Watson Assistantで作った恋人ボットを使います。

    まずはサイトのガワを作る

    入力ボックスとレスポンスを表示する領域だけのシンプルな作りにしてみました。

    まあまあじゃないでしょうか。

    curlでテストする

    APIのリクエストを送るんですが、内容が正しいかどうかテストしておきたいですね。
    あんまり使い慣れないんですが、コマンドプロンプトからcurlコマンドでやってみます。

    公式のドキュメントを調べて書いたコマンドはこんな感じ。
    curl -X POST -u "apikey:********************************************" --header "Content-Type:application/json" --data "{\"input\": {\"text\": \"Hello\"}}" "https://gateway.watsonplatform.net/assistant/api/v1/workspaces/************************************/message?version=2018-09-20"

    結果:

    結果は成功してるけど日本語部分が文字化けしてる!!

    これはコマンドプロンプトの文字コードが問題だったみたいです。
    以下のコマンドで直りました。
    chcp 65001

    結果:

    無事取得できたみたいです。

    ご覧の通り、Watson AssistantのレスポンスはJSON形式なので、ここからデータを取り出す必要がありますね。
    それはあとでやります。

    Welcomeメッセージを取得する

    ただ、チャットボットをシナリオには起動した時のメッセージが入っていたはず。
    それを取得するにはどうすればいいかな。

    とりあえず、–data オプションを外してみます。
    curl -X POST -u "apikey:********************************************" --header "Content-Type:application/json" "https://gateway.watsonplatform.net/assistant/api/v1/workspaces/************************************/message?version=2018-09-20"

    いけましたね。

    XMLHttpRequestでやってみる

    では、早速Webページのjavascriptから呼び出してみます。

    XMLHttpRequestでAjax的に呼び出せるでしょうかね。
    curlをXMLHttpRequestに直してみました。
    これでページ読み込み後にwelcomeメッセージを表示してもらえるはず。

    window.onload=function(){
      sendmessage_api = new XMLHttpRequest();
      sendmessage_api.onreadystatechange = function() {
        if(sendmessage_api.readyState==4) {
          if( sendmessage_api.status == 200 || sendmessage_api.status == 304 ) {
            document.getElementById("chatbot_serif").innerText = sendmessage_api.responseText;
          }else{
            console.log( 'Failed. HttpStatus: '+sendmessage_api.statusText );
            document.getElementById("chatbot_serif").innerText = "具合が悪そうです";
          }
        }
      };
      sendmessage_api.open("POST","https://gateway.watsonplatform.net/assistant/api/v1/workspaces/*******************************/message?version=2018-09-20");
    sendmessage_api.setRequestHeader('Authorization', 'Basic apikey:***************************************');
      sendmessage_api.setRequestHeader('Content-Type', 'application/json');
      sendmessage_api.send();
    };

     

    ん??

    あれ、エラーが出ていますね。(そんなエラーメッセージはどうなんだ?)

    コンソールを見てみると、「クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、https://gateway.watsonplatform.net/assistant/api/v1/workspaces/*********************/message?version=2018-09-20 にあるリモートリソースの読み込みは拒否されます」と出てます。

    ブラウザから直接読むなって怒られた感じですかね。
    というかパスワードとかも丸見えですしね。
    やっぱり横着はいけません。

    なので次回はphpかpythonでやってみようと思います。

    続く。

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    アバター投稿者 staff

    投稿日: 2019/04/022024/04/26

    カテゴリー 技術 / デザイン / 制作
  • チャットボットとベトナムオフショア開発をマーケティングテクノロジーフェアに出展しました

    チャットボットとオフショア開発をマーケティングテクノロジーフェアに出展しました

    2019年2月7日(木)・8日(金)に開催されたマーケティングテクノロジーフェアにチャットボット「FirstContact」とベトナムオフショア開発を出展してきました。

    “チャットボットとベトナムオフショア開発をマーケティングテクノロジーフェアに出展しました” の続きを読む

    このエントリーをはてなブックマークに追加
    Share on Tumblr
    Tweet

    板羽 晃司投稿者 板羽 晃司

    投稿日: 2019/02/272019/02/27

    カテゴリー デバイス・端末, ベトナム / オフショア開発, 技術 / デザイン / 制作

投稿ナビゲーション

前のページ ページ 1 … ページ 15 ページ 16 ページ 17 … ページ 49 次のページ