質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.21%

JavaScriptで任意の桁の数字をランダムで取得して細分化、計算するにはどうしたらいいですか?

受付中

回答 7

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,157
退会済みユーザー

退会済みユーザー

口で説明するのは難しいんで図にしました。
例えば1234(変数a)+9876(変数b)の場合
画像といった感じです。
暗算ゲーム的なものですがどのように実行したらいいですか?
おそらく5は普通に a + b の答えかと思うのですが1,2,3,4はどうしたらいいかわかりません。ある程度イメージはできるのですが文にできません。すいません。しかし、もし私が考えているのが正しかったら1234 + 987のような桁が違う計算をするには987の前に0を追加して0987にしないと無理っぽいです。何言ってるかわからないかもしれませんが何卒お願いします。
みなさんありがとうございます。質問させていただいてる分際で言うのもなんですが、なんだかだいぶ難しそうなので少しお時間を頂きたいです。いろいろ試行錯誤して何か期待通りに動かなかったときはその時に質問させていただいてもよろしいでしょうか?ベストアンサーを選べなくて本当に申し訳ないのですが、みなさまの貴重な回答はとてもためになりました!誠にありがとうございます!
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nekora

    2015/05/28 11:15

    えっと、これからサンプルコードを書こうとしていたのですが、仕様が把握できないので情報の追記をお願いします。
    追記していただきたいことは、
       タイトルにランダムに取得とありますが、間違いないですか?
    実際の例では
     変数aが、1234  変数bが、9876
    となってて、
     例で、どちらも、左端から数字を取り出した組み合わせになっていますが
    ランダム取得ならば、状況によっては
     1000 70
    30 6
    200 800
    4 9000
    こういった組み合わせもあるという認識でよろしいでしょうか?

    そして、5番の意味が分りません、この合計とは何でしょう?
    変数aで言えば、
    バラバラに取り出した、1000,200,30,4を出したものと、変数bも同様にして足したものを
    さらに、足すと言うことでしょうか?
    まぁ、仰る通り、今書いた通りならば、つまりは a+bになりますが
    だからと言って、a+bで済ましていいのか?それとも、各切りだした数値を、ちゃんと合計して
    結果的にa+bだね。というロジックがほしいのか?どちらでしょうか?
    追記いただけると幸いです

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/05/28 15:36

    1~4は数字を桁ごとに分割し、大きい順に並べた数字ですので6桁(235,711)なら上の図で例えると①~⑥までできて①は6桁目の数字+00000、②は5桁目の数字+0000と言った感じでこの場合6まで製作されます。1は200,000、2は30,000、3は5,000、4は700、5は10、6は1となります。
    上の図の5ですが変数aと変数bの合計値になります。まだ説明不足かもしれませんがその時はまた、一言ください。

    キャンセル

回答 7

+1

任意の桁数の数値を取得したいのでしょうか。

であれば、1つの方法として数値を文字列に変換した後、任意の位置の文字を取得、
再度、数値に戻すと言う方法があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/28 15:44

    この発想はありませんでした!素晴らしいアイディアをありがとうございます!

    キャンセル

+1

適当に書いてみました。
Node.jsでしかテストしていませんが、たぶん動くはず・・・!
var a = 1234;
var b = 9876;

(function ketagoto(a, b){
    var _al = (a + '').length;
    var keta = 1;
    for(i=0; i<_al-1; i++){
        keta *= 10;
    }
    if(a >= 10){
        var _a = a - (a % keta);
        var _b = b - (b % keta);
        console.log(_a + ' + ' + _b + ' = ' + (_a + _b));
        ketagoto((a % keta), (b % keta));
    } else {
        console.log(a + ' + ' + b + ' = ' + (a + b));
    }
})(a, b);
console.log(a + ' + ' + b + ' = ' + (a + b));

桁数の出し方はswordoneさんのやり方の方が性能いいかもしれませんね。
とは言え、そもそも性能気にした書き方はしてないので、ご参考程度に。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/28 15:47

    ありがとうございます!とても参考になりました!

    キャンセル

+1

こんにちは。
swordoneさんの方法をjavascriptで書けないかと考えてみたら思いの外簡単に記述できたので載せておきます。
var a = 1234;
var b = 9876;
// 桁数を得る (桁数が多い方を取得)
var len = Math.max(("" + Math.abs(a)).length, ("" + Math.abs(b)).length);

// 式を出力 (ここではコンソールに出力してます、必要に応じてHTML要素を挿入するコード等に書き換えて)
var cnt = 0;
for (var i = Math.pow(10, len-1); i >= 1; i /= 10) {
    var val_a = a % (i*10) - a % i;
    var val_b = b % (i*10) - b % i;
    var val_sum = val_a + val_b;
    console.log([(++cnt)+")", val_a, "+", val_b, "=", val_sum].join(" "));
}
console.log([(++cnt)+")", a, "+", b, "=", a+b].join(" "));
実際に使われる数値の範囲は分かりませんが、マイナスでもいけるようですね。

参考になれば幸いです。


===== 追記 =====
ちょっとした違いですが、桁数を得るところはこちらの方がパフォーマンス良さそうですね (計測はしていませんが..)
まあ速度のことを言い出すとキリがないのでこれも参考までに。
var len = ( "" + Math.max(Math.abs(a), Math.abs(b)) ).length;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/28 15:49

    ありがとうございます!実行速度のことまで気にしていただいて助かります!

    キャンセル

+1

他の方が数学的解決策なので自分は黒魔術でも使っておきます。

//対象の数字
var n1=1520,n2=1472;

(function (num1,num2){
  //文字列化
  var string_n1=num1+"",string_n2=num2+"";
  var returnArray=[];//返却用配列
  
  //桁数合わせ
  while(string_n1.length!=string_n2.length){
    string_n1.length<string_n2.length ? string_n1="0"+string_n1 : string_n2="0"+string_n2;
  }
  
  //乗数の生成
  function _c1(n){
    var r="1";
    while(n--){
      r+="0";
    }
    return r;
  };
  
  //各桁の数と_c1()で生成した乗数を掛ける
  function _c2(n,len){
    return n*_c1(len);
  };
  
  //桁数の分だけループ
  for(var i=0,len=string_n1.length-1;i<=len;i++){
    returnArray[returnArray.length]=_c2(string_n1[i],len-i)+_c2(string_n2[i],len-i);
  }
  
  //出力
  console.log(returnArray);
  
}(n1,n2));

マイナス値には対応していません。
以下必要なさそうですが解説。

文字列化することによりlengthの取得と添え字参照による各桁の取得を行っています。
_c1()から出力される値は文字列ですが_c2()内で型変換により数値になります。

for文内len-iですがまずlenはlength-1が代入されており、この例ですと4-1==3となりますね。
最初iは0ですのでlen(3)-i(0)==3となります。
次にiは1ですのでlen(3)-i(1)==2となります。

このことにより乗数の0の数が算出できますね。

以上が黒魔術的コードです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/28 23:30

    あ、変数や関数名の命名は見逃してください……。
    ノンプログラマには良い名前が思いつかなかったんです。
    もう答え出てるし黒魔術使おうという思い付きだったもので。

    キャンセル

0

javascriptの書き方がわからないので算術的な話だけします.
例えば100の位を取りたければ
a % 1000 - a % 100
で表せます.それぞれの桁数が必要なら,aが0より大きい整数として
log(10)a + 1  (log(10)aは10を底としたaの対数)
の整数部分を取れば得られます.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/28 15:45

    ありがとうございます!こんな方法があるんですね・・・知りませんでした!

    キャンセル

0

ランダム関数じゃダメなんですか
Math.random()
で0~1のランダムな数字になるんで欲しい桁数だけ10で乗算して小数点以下切れば終わると思いますよ。
例えば③なら99までなので
Math.floor(Math.random () * 100))
が0〜99までの数字になると思います(たぶん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/03 06:57

    なるほど与えられたランダムな2つの値a, bを桁ごとに区切っていくのではなく、
    はじめにa, bの桁数をランダムで決定して
    桁毎にランダムな数値を生成していくという手も使えるかもしれませんね…考えつきませんでした

    ただ、③は十の位の計算なので0~9を十倍した数のどれかで99ということはないはずですよ
    コードは Math.floor(Math.random()*10) * 10; になると思います。

    キャンセル

  • 2015/06/03 12:12

    やっとやりたい事がわかりました。
    あと勘違いでランダム関数は0.00010758025などという場合もあるので
    こんな感じでできると思う。
    概念的に構文とか無視で書いているので、この方法でやるならtry&errerは自分で。

    ランダム数字生成

    for(i=0;i++;i=<1){
    a[i]=任意の桁数-1
    b=Math.random()
    while(b>=Math.pow(10,a[i])){
    b=*10
    }
    figure[i] = Math.floor(b)
    }

    みたいな感じで4桁ランダム数字がfigure[]に2個できます。
    桁数をどう決めるのか分からないのでそこは自分でお願いします。

    細分化
    if(a[0]>=a[1])
    c=a[0];
    else
    c=a[1]
    ▲桁数が高い方をcに代入
    d=c;
    for(i=0;i++;i<=c){
    left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d)
    right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d)
    ▲例1234なら1234/1000で1.234にして整数化して1000を掛けて1000にしているみたいな計算
    d--;
    }

    でleft[]に{1000,200,30,4}と入ってると思います。right[]も同様
    この計算の利点は左右で桁が違う場合しっかり計算できるところです。
    例1234+987の場合1234は1000になり987は1000で割ると0.987 なので0になり格納される。left[]={1000,200,30,4} right[]={0,900,80,7}となってるはず。

    キャンセル

  • 2015/06/03 12:14

    不等記号間違えてました。他もあるかもです。

    for(i=0;i++;i=<1){
    a[i]=任意の桁数-1
    b=Math.random()
    while(b<=Math.pow(10,a[i])){
    b=*10
    }
    figure[i] = Math.floor(b)
    }

    キャンセル

  • 2015/06/04 04:52

    細かいところですがiがグローバルですね

    キャンセル

0

見にくかったので新しい回答でコード化しました。

概念的に書いて構文とか無視してるので間違い多いです。
この方法でやるならtry&errerは自分で。

ランダム数字生成
for(i=0;i<=1;i++){
    a[i]=任意の桁数-1
    b=Math.random()
    while(b>=Math.pow(10,a[i])){
        b=*10
    }
    figure[i] = Math.floor(b)
}

みたいな感じで4桁ランダム数字がfigure[]に2個できます。
桁数をどう決めるのか分からないのでそこは自分でお願いします。

細分化
if(a[0]>=a[1])
    c=a[0];
else
    c=a[1]
▲桁数が高い方をcに代入
d=c;
for(i=0;i<=c;i++){
    left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d)
    right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d)
    ▲例1234なら1234/1000で1.234にして整数化して1000を掛けて1000にしているみたいな計算
    d--;
}
でleft[]に{1000,200,30,4}と入ってると思います。right[]も同様
この計算の利点は左右で桁が違う場合しっかり計算できるところです。
例1234+987の場合1234は1000になり987は1000で割ると0.987 なので0になり格納される。left[]={1000,200,30,4} right[]={0,900,80,7}となってるはず。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/03 12:50

    投稿したあとに気づきます。
    for(i=0;i<=c;i++){
      left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d)
      right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d)
      figure[0]-=left[i]◀︎これ入れないとダメでした
      figure[1]-=right[i]◀︎同上
    d--;
    }

    キャンセル

  • 2015/06/03 14:09

    わざわざコメントしなくとも,自分の回答はあとから編集できますよと言っておきます

    キャンセル

  • 2015/06/03 14:38

    なるほど!

    キャンセル

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

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る