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

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

ただいまの
回答率

90.98%

  • Ruby

    6391questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

出目が0~3のサイコロを振って、0~3までが全部出た時の、振った回数の合計をカウントするプログラムを作りたいです

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 170

kintarock777

score 11

ru###発生している問題・エラーメッセージ

ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

c:\Ruby23-x64\ruby>ruby count.rb
count.rb:2: syntax error, unexpected ',', expecting keyword_do_cond or ';' or '\n'
until  no0 == true, no1 == true, no2 == true, no3 == true
^
count.rb:2: syntax error, unexpected ',', expecting end-of-input
until  no0 == true, no1 == true, no2 == true, no3 == true

試したこと

count = 0
until  no0 == true, no1 == true, no2 == true, no3 == true
deme = Random.rand(4)
if 
deme = 0
no0 == true
count += 1
elsif
deme = 1
no1 == true
count += 1
elsif
deme = 2
no2 == true
count += 1
else
no3 = true
count += 1
end
end
p count

このようなコードを書きました
no0~no3すべての値がtrueになった時に繰り返しが止まって、カウント数が表示できるようにしたいです。
よろしくお願いします。

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

基礎が出来ていないので、もうちょっと簡単な5行程度のプログラムから始めた方が良いと思います。
元の物を活かして正しくすると、

no0 = no1 = no2 = no3 = false
count = 0
until no0 and no1 and no2 and no3
  deme = Random.rand(4)
  if deme == 0
    no0 = true
    count += 1
  elsif deme == 1
    no1 = true
    count += 1
  elsif deme == 2
    no2 = true
    count += 1
  else
    no3 = true
    count += 1
  end
end
p count


なお、普通はこう書きます。

N=4
num = Array.new(N)
count = 0
until num.all?
  deme = Random.rand(N)
  num[deme] = true
  count += 1
end
p count

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/16 00:06

    otnさん回答いただき、ありがとうございました。
    まだprogramingの勉強を始めたばかりで、入門書を片手に四苦八苦しています。
    乱数の説明のところにきて、試したいprogramを思い付き自力で試してみたのですがダメでした。
    私の書いたコードを訂正いただいた後、より簡潔なコードまで教えていただき、大変勉強になり、
    また今後、programingを続けて行くうえで大変勇気付られています。
    これからも、よろしくお願いいたします。

    キャンセル

  • 2017/09/16 00:07

    早速、写経してコードの書き方を、おぼえます

    キャンセル

  • 2017/09/16 00:39

    > 乱数の説明のところにきて、試したいprogramを思い付き自力で試してみたのですがダメでした。

    なるほど。そういう事で書いたプログラムなら良いと思います。
    まずは = と == の使い方を覚えましょう。

    キャンセル

  • 2017/09/16 08:30

    がんばります

    キャンセル

+1

すでに ベストアンサーが決まっていますが、別の書き方をしてみました。

y.rb

N = 4

nums = []
nums << Random.rand(N) while nums.uniq.size != N

p nums.size
p nums

出た目の履歴を nums にすべて記録しています。
nums.uniq は重複をなくした結果になります。
重複をなくしたときのサイズが 4 ならすべての目が一度は出たことになります。

すべての目がでたら、サイコロを振った回数と、出た目の履歴を出力しています。

実行例イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/16 08:38

    回答ありがとうございます。
    早速試してみました。
    実行した後の、表示形式がとてもカッコイイですねぇ(Cool !)テンションあがります(喜)
    配列の使い方の参考にもなりました、ホントに勉強になります。

    nums << Random.rand(N) while nums.uniq.size != N
       

    ただまだ知識不足で、この主要部分の構造が理解出来ていません。
    とりあえず、丸暗記で覚えようと思いますが、
    補足可能でしたら、もう少し教えてください。

    キャンセル

  • 2017/09/16 08:43

    追記

    特にuniqは、初めて見るメソッド???なので、よくわかりません
    よろしくお願いします

    キャンセル

  • 2017/09/16 09:24

    nums << Random.rand(N) while nums.uniq.size != N
    は、次と同じです。

    while nums.uniq.size != N do
    nums << Random.rand(N)
    end

    参考:
    https://techracho.bpsinc.jp/hachi8833/2017_01_10/32333#2-26
    > whileやuntilの本文が単文の場合は後置にするのが望ましい

    nums << xxx
    これは、 配列の最後に xxx を 追加するというものです。
    参考:
    https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--3C--3C

    uniq
    uniq は配列から重複した要素を取り除いた新しい配列を返します
    参考:
    https://docs.ruby-lang.org/ja/latest/class/Array.html#I_UNIQ

    キャンセル

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

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

関連した質問

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

  • Ruby

    6391questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • トップ
  • Rubyに関する質問
  • 出目が0~3のサイコロを振って、0~3までが全部出た時の、振った回数の合計をカウントするプログラムを作りたいです