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

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

ただいまの
回答率

90.84%

  • C#

    5981questions

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

  • Unity

    3210questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

連続しない範囲から、Randomで値を取得する方法

解決済

回答 3

投稿

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

necos

score 39

教えて欲しいこと

Unityで
連続しない値の範囲から、Randomで値を取得する良い方法を教えて欲しいです。

通常は
0~10までの範囲から、ランダムで取得する場合

var result = UnityEngine.Random.Range(0, 10 +1);

となりますが、

たとえば3をその範囲からはずす場合は、どのようにしたらスマートに実装できるでしょうか?

考えた方法は以下の通りですが、もっとうまいやり方をご存知の方がいらっしゃる用でしたら、教えていただきたいです。

List<int> removedList = new List<int>();
for(var i = 0; i < 11; i++)
{
    if(i == 3) continue;
    removedList.Add(i)
}
var result = removedList[Random.Range(0,removedList.Count)]

よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

LINQを使った感じでこんなのはどうでしょうか

var result = Enumerable.Range (0, 10 + 1) //0〜10生成
    .Where (e => e != 3) //3以外のものを抽出
    .OrderBy (e => Guid.NewGuid ()) //ランダムに並び替え
    .First(); //先頭の要素を取得

 追記

ちょっと質問の意図を理解していない可能性があるので的外れなら無視していただいて構いません

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/11 14:23

    質問のコードをLINQで置き換えるなら、頭にvar result = を付けて最後のToListをFirstにすればよいです。

    キャンセル

  • 2018/05/11 14:26

    確かに質問者さんは一つの値を取り出したいようでしたね、コードを修正しておきますありがとうございます。

    キャンセル

  • 2018/05/11 19:10

    回答ありがとうございます!
    また、コメントまでつけていただいて大変分かりやすかったです。
    Linqを使ったその発想は、自分だけではたどり着かなかったと思います。
    ありがとうございました。

    キャンセル

+1

以下のどちらでもできそうです。
質問者さんのコードは以下の両方の考え方が混在しているように思います。

 例1

using System.Collections.Generic;
using UnityEngine;

// あらかじめ必要な要素のみを含むリストを使う例
public class InclusionPickup : MonoBehaviour
{
    [SerializeField] List<int> inList;    // 必要な要素のみを含むリスト

    private void Update ()
    {
        // マウスの左クリック
        if ( Input.GetMouseButtonDown ( 0 ) )
        {
            var element = inList[Random.Range(0, inList.Count)];

            print ( element );
        }
    }
}

 例2

using System.Collections.Generic;
using System.Linq;                      // LINQを使う
using UnityEngine;

// 除外する値のリストを使う例
public class ExclusionPickup : MonoBehaviour
{
    [SerializeField] List<int> exList;    // 除外する値のリスト
    [SerializeField] int maxValue;        // 乱数の最大値

    private void Update ()
    {
        // マウスの左クリック
        if ( Input.GetMouseButtonDown ( 0 ) )
        {
            // 乱数で選択
            var element = Random.Range(0, maxValue);

            // 除外リストの値と一致していたら引き直す
            while ( exList.Any ( x => x == element ) )
            {
                element = Random.Range ( 0, maxValue );
            }

            print ( element );
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

配列に対象となる数字を入れて、そのインデックスを乱数で生成する。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/11 14:12

    失礼しました。質問に書いてあるのと同じでした。

    キャンセル

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

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

関連した質問

  • 受付中

    c言語

    1から100までの重複のない乱数を作成して、そこから10個の三の倍数を抜き出すプログラミングを教えてください。

  • 解決済

    オブジェクトを内包した配列から特定のkeyを持つ要素をグルーピングしたい

    [ { gender: 'man', name: 'A男' }, { gender: 'woman', name: 'A子' },

  • 受付中

    この問題のプログラムはどうなるのですか?

    実現したいこと 初歩的な質問だとは思うのですが、答えていただけると幸いです 下の問題を解くとプログラムはどういう風になるのかプログラムを書いていただけると幸いです。 お願いし

  • 受付中

    C# 乱数で生成する数字の出現頻度

    実現したいこと C#の乱数宣言(0~7)を行いましたが、特定の数字だけめったに生成されないように頻度の調整を行いたいです。 頻度調整の対象になる数字1~3です。 各数字ごとに

  • 解決済

    「-3, -2, -1, 1, 2, 3」の6つの整数をランダムで得る「いい」方法

    最初は「-3~3の整数を得る」という仕様でよく、こんな感じでした。※本当の最初のコードはコメントアウトの物でしたが、ごくまれに-4が出るというバグがあるので修正しました。 v

  • 解決済

    [Unity]落とすアイテムを増やしたい

    Unityでりんごが落ちてくるゲームを作っています アイテムを2つまでは落とせるようになったのですが3つ目のアイテムをどうすれば落とせるのかがわかりません どうすれば3つ目4つ

  • 解決済

    Listを使って出力した乱数を奇偶にわけたいです

    某サイトのコレクションに関する問題で躓いています。 問題の条件として Listg型の可変長配列を生成し乱数を奇偶判別し格納するというメソッドを作りなさいと のことなのですが

  • 解決済

    プログラム言語の課題

    C言語の問題です。 1から100までの整数に対して、6の倍数の合計を求めるプログラムを作成しなさい。ただし、for文とif文を用いて作成すること。 分からないです。お願いします

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

  • C#

    5981questions

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

  • Unity

    3210questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。