問題タブ [dice]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - サイコロの目で現れる数字の頻度を決定する
ゲームの場合、特定のサイコロを振ったときに特定のサイコロが出る頻度を決定しようとしています。私は知っています...その質問は奇妙に思えます。実数で説明してみましょう。
したがって、1つのサイコロの場合、各番号の頻度は同じになります。1〜6は同じ回数表示されます。
2つのサイコロの場合、状況は異なります。5,6,7が最も頻繁にロールされると思いますが、スペクトルの両端の数字は表示されないか、まったく表示されません(1の場合)。このリストを計算して、頻度の高いものから低いものへと適切な順序で表示する方法を知りたいです。
何かご意見は?
@duffymo-それを思い付くためのある種のアルゴリズムがあるとはいえ、本当に素晴らしいでしょう。上記の方法では、多くの手作業による数字の選択と配置が必要になるようです。私のダイカウントが10まで動的である場合、それを手作業で行うのは非効率的で面倒だと思います。:)
language-agnostic - サイコロの転がり記譜文字列を評価する
ルール
文字列をパラメーターとして受け取り、式の評価値をサイコロ表記で返す関数を作成します。これには加算と乗算が含まれます。
物事を明確にするために、法的な表現のEBNF定義を次に示します。
入力例:
- 「3d6+12」
- 「4*d12 + 3」
- 「d100」
eval関数などの使用は禁止されていませんが、これらを使用せずに解決することをお勧めします。再入学大歓迎です。
出力はランダムでなければならないため、テストケースを提供することはできません;)。
回答のタイトルのフォーマット: 言語、n 文字 (重要な注意 — 評価なしなど)
私のルビーソリューション、9281 文字、eval を使用:
もう 1 つのRubyソリューションは、短くはありません (92 文字) ですが、興味深いと思います。これはまだ eval を使用していますが、今回は非常に創造的な方法です。
c# - C#コンソールアプリケーションでサイコロを振ると、合計が正しくなくなります
私はC#コンソールでサイコロローラープログラムを書いています。私は2つの入力を与えています
- サイコロのサイズを入力し、
- プレイしたい時間を入力します。
サイコロのサイズが私がプレイした6倍と10倍だとします。
合計:33(実行ごとに修正されるわけではありません。これは変更されません)
しかし、私の要件は、この合計は常にプレイ回数でなければならないということでした。ここで私は10回プレイしているので、合計は33ではなく10になるはずです。新しい数字ごとに発生するはずです... 100回プレイする場合、合計または合計は100で、他の数字だけではありません。残りはすべて同じままで、私のプログラミングでは期待される合計が得られません。誰かがそれを修正してください。これが私のコードです:
Dice.cs:
python - Combinatorics Counting Puzzle: 20 個の 8 面ダイスを振って、同じ値のダイスが 5 個以上出る確率は?
1 人が 8 面体のサイコロを 20 個振って、合計 8 の 20 乗の可能な結果が得られるゲームを想定します。特定のイベントが発生する確率を計算するには、イベントが発生する可能性のある方法の数を 8^20 で割ります。
値 3 のサイコロを正確に 5 つ得る方法の数を計算できます。(20 が 5 を選択) は、3 のオーダー数を示します。7^15 は、15 回のロールで値 3 を取得できない方法の数を示します。 .
答えは、文字列 3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0 を並べ替えることができる方法の数として見ることもできます,0,0 (20 は 5 を選択) にゼロの値の総数 (有効な値が 7 つあると仮定) 7^15 を掛けます (これは正しいです)。
質問 1: 同じ値 (つまり、すべてのサイコロの値) のサイコロを正確に 5 つ得る方法の数を計算するにはどうすればよいですか? 注: 上記の最初の答えを単純に使用して bt 8 を掛けると、膨大な量の二重カウントが発生しますか?
ケース (5 1's)、(5, 2's)、(5, 3's)、... (5's, 8) のそれぞれについて、それらを合計することができることを理解しています (より単純には 8*(5 1's) )。次に、オーバーラップ数の合計 (5 1) と (5 2)、(5 1) と (5 3)... (5 1) と (5, 2) と ... と (5, 8) を引きます。しかし、これは非常に面倒です。これを一般化して、多数のサンプルと多数のクラスにスケールアップします。
同じ値のサイコロを 5つ以上得る方法の数を計算するにはどうすればよいですか?
したがって、11111000000000000000 または 11110100000000000002 または 11111100000001110000 または 11011211222222223333 ですが、00001111222233334444 または 00051174134252 ではありません。
数学を説明するか、これをサポートするライブラリ(特にpythonモジュール)を指す答えを探しています。詳細と例の追加ポイント。
c# - C# でのサイコロ式 (3d6+5 など) の解析: どこから始めればよいですか?
そのため、C# で「サイコロ式」を解析して評価できるようにしたいと考えています。サイコロ式は次のように定義されます。
したがって、たとえばd6+20-2d3
、許可され、次のように評価する必要があります
またd%
、 と同等である必要がありますd100
。
いくつかの解決策をハックできることはわかっていますが、これは非常に典型的なコンピューター サイエンス タイプの問題のように見えることもわかっているので、調査すべき非常に洗練された解決策があるに違いありません。
解析の結果に次の機能を持たせたい:
- 式の正規化された形式を出力できるはずです。私はサイコロを最初に考え、サイコロのサイズでソートし、常に接頭辞を付けます。したがって、たとえば上記のサンプルは になり
1d6-2d3+20
ます。また、 のインスタンスは正規化された形式にd%
なります。d100
- 式を自由に評価して、毎回異なる乱数をローリングできるようにする必要があります。
- すべてのダイスロールを最大化して式を評価できるはずです。たとえば、上記のサンプルでは (決定論的に) が得られ
1*6+20+2*3 = 32
ます。
これはまさに Haskell や、おそらく他の関数型言語が得意とするタイプのものであることはわかっていますが、可能であれば C# にとどまりたいと思っています。
私の最初の考えは、再帰、リスト、そしておそらくいくつかのLINQに向かう傾向がありますが、繰り返しますが、物事を知っている人々からのいくつかの指摘なしで試してみると、それは洗練されていない混乱になってしまうと確信しています.
機能する可能性のある別の戦術は、サイコロ式をrand.Next
呼び出しに変換するための最初の正規表現ベースの文字列置換と、その場での評価またはコンパイルです...これは実際に機能しますか? rand
毎回新しいオブジェクトを作成しないようにするにはどうすればよいですか?
c# - C#コードは、ステップスルーで期待される結果しか得られませんか?
わかりましたので、サイコロを投げるアプリを持っています...
コードをステップ実行すると、正常に機能し、「結果」に正しい数のスロー結果が含まれ、ランダムに表示されます。コードを実行してまったく同じことを行うと、一連の同一の数値が生成されます。
これは私には見えない論理的なエラーだと確信していますが、何時間もいじっても状況は改善されませんでした。:)
php - PHP はサイコロの面を選択しますか?
ユーザーが自分の番号を送信したときに、私のコードの php セクションが正しい操作を実行していません。ただし、私のコードが機能する場合と機能しない場合があります。
別の変数を作成せずに、ここで rand を比較する方法はありますか?
ユーザーが 5 を選択した場合、5 をエコーアウトしたいのですが、異なる値が得られますか?
random - 1 つの数値 (LUA) で複数の桁間隔を生成しようとしています。
基本的に、0 から 2^16-1 までの数値を返すことができるランダム関数を使用する必要があります。
私はこれを利用して、たとえば、1 と 6 の間の 6 つの間隔を生成しようとしています (ダイス ポーカーを考えています)。基本的に、私のためにランダムに生成されたその1つの番号を使用し(範囲のみを指定できます)、できれば1回だけ呼び出す必要があります。次に、その数字を取り、値が 1 ~ 6 になるように 6 つのサイコロに「分割」します。
頭に浮かぶのはビットマスキングですが、これが正しいコンテキストであるかどうかはわかりません。
バイナリの観点からすると、サイコロの値を 0 ~ 5 にするのが合理的です。これにより、2 進数の 000-101 が得られます。ここで、ランダム関数の戻り値の最大値は 101101101101101101 (6 つのサイコロ、それぞれが「6」) になり、10 進数では、ランダムな int 戻り値の上限が 187245 になることを意味します。下限は 0 になります。 random 関数は数値 66508 を返し、バイナリ形式にすると 010|000|001|111|001|100 になりますが、これでは十分ではありません! この場合、サイコロの 1 つが 111 = 7 になり、間隔が 0-5 (1-6) であるはずのときにそれを取得できません:(
制限範囲内の 10 進数に 1 ~ 6 (0 ~ 5) の値を持つ 6 つのサイコロを含める方法を理解する必要がありますが、助けが必要です。
c++ - msvcrt.dll は、rand() 関数に線形合同ジェネレーターを使用しますか?
msvcrt の rand() 関数を使用して 3 つのサイコロの面を生成するプログラムの出力を予測しようとしています。コードは次のようなものだ
dice[0] = rand() % 6 + 1; dice[1] = rand() % 6 + 1; dice[2] = rand() % 6 + 1;
と思います: 、線形合同ジェネレーターの予測プログラムを使用して、シーケンス内の次の数値を予測できるかどうか疑問に思っていました。
c# - 単体テストでのループが悪い?
ランダムなサイコロのロールに依存する単体テストがあります。私は 20 面ダイスを振って、値が 20 の場合、クリティカル ヒットとしてカウントします。
私が今していることは、20 面ダイスを 300 回まで転がすことです。これらのロールのいずれかが 20 の場合、クリティカル ヒットが発生したことがわかります。
コードは次のようになります。
テストは私が望んでいることを正確に実行しますが、何か間違ったことをしているように感じずにはいられません。
関連して、DiceRoll クラスには他の情報も含まれていますが、私の質問は特に単体テストでのループに関するものなので、より明確にするために省略しました