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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

652閲覧

乱数を重複なく複数回表示したい

mjpaz14f

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/10/02 08:40

###前提・実現したいこと

現在unity5.6.1で落ちもの型のパズルゲームを作成しています。
7種類のブロックをランダムに重複なく一つずつ生成し7種類すべて生成したら、またランダムに7種類のブロックを生成と考えてネットを参考にしたところfor文を使うことにしたのでエラーなく動かすため試行錯誤し、ブロックの生成をfor文の中にいれました。

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

現在下記のコードではブロックの操作途中に次以降のブロックも出現してしまいます。 7種類のブロックをランダムに重複なく一つずつ生成できない。

###該当のソースコード
c#

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net; using UnityEngine.Networking; public class Spawner2 : MonoBehaviour { public GameObject [ ] groups; public void spawnNext(){ //Random Index //// int i = Random.Range(0,groups.Length);//0からgroups.Lengthまでの数値をランダムに返す Random ransu = new Random(); int random =Random.Range(1,8); int [] number = new int [7]; for(int ran = 0;ran < number.Length; ran++) { number[ran] = ran + 1; } for( int ran = 0;ran < number.Length;ran++) { int temp = number[ran]; number[ran] = number[random]; number[random] = temp; }for(int ran = 0;ran < number.Length; ran++) { int i= number[ran]; Instantiate(groups[i], transform.position, Quaternion.identity); } } // Use this for initialization void Start () { spawnNext(); } } ###補足情報 以下のサイトを参考にしました。 http://hatena.hinakana.net/entry/2015/03/07/HelloWorld%E3%81%8B%E3%82%89%E3%81%AEC%23%E5%85%A5%E9%96%80%EF%BC%81%EF%BC%81%E9%87%8D%E8%A4%87%E3%81%97%E3%81%AA%E3%81%84%E4%B9%B1%E6%95%B0%E3%81%A8%E5%A6%B9%E3%81%AE%E5%87%BA%E7%94%A3%EF%BC%81 https://translate.google.co.jp/translate?hl=ja&sl=en&u=https://noobtuts.com/unity/2d-tetris-game/&prev=search

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2017/10/02 09:06

誤解されがちですが、ランダムというのは重複することも許容されるものです。重複しないようにするには、別な工夫が必要となります。例えば、7種類のブロックを用意する代わりに7つの配列を用意し、ブロックのタイプを各配列にシャッフルして入れ、順番に読み込むなどです。ちなみにコードは```で囲っていただくと見易くなります。
guest

回答1

0

ベストアンサー

取得用のリストを持っておいて、そちらに返したい当たりのリストをランダムに詰め込みます。
後はそちらから順番に一つずつ取得していけば、重複のないリストが取得できます。

C#

1 using System.Linq; 2 3 4 readonly List<int> master = new List<int>(){0,1,2,3,4,5,6}; 5 readonly List<int> temp = new List<int>(); 6 private int GetIndex() 7 { 8         //返すリストの中身が空っぽだったらランダムに詰めなおす 9 if(temp.Count <= 0) 10 { 11 temp.AddRange(master.OrderBy(i => System.Guid.NewGuid())); 12 } 13 var ret = temp[0]; 14 temp.RemoveAt(0); 15 return ret; 16 }

こんな感じでランダムに0~6の数字を出力できます。

投稿2017/10/02 10:00

ShiroKuroShiro

総合スコア134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問