2017-04-19 24 views
-2

リストから2つのアイテムをランダムに選択しようとしています。これらの項目はシーン内で可視に設定されます。問題は、以前のループで選択されたものを選択することがあることです。2リストからランダムに選択 - C#

最初の選択をどのように除外しますか?

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class BeamManager3 : MonoBehaviour { 

public List<GameObject> LargeBeamObject = new List<GameObject>(); 

void Start() { 
    LargeBeamPlayerGenerator(); 
} 

void LargeBeamPlayerGenerator(){ 
    for (int i = 0; i < 2; i++){ 
     int randomGameObject = Random.Range(0,4); 
     GameObject selectedGameObject = LargeBeamObject[randomGameObject]; 
     MeshRenderer visible = selectedGameObject.GetComponent<MeshRenderer>(); 
     visible.enabled = true; 
    } 
} 

} 
+1

秒を選ぶとき、それは同じことを選ぶ場合、リトライ。または、最初のピックを選択肢から削除してから、2番目のピックを選択します。非常に多くの可能性があります。 – CSharpie

+0

リストから最初のピックを削除し、新しいリストの長さ-1をRandom.Rangeの2番目のパラメータとして再度選択します。このユニティは、btwですか?もしそうなら、それにタグを付けるべきです。 –

+1

これは複製です。 http://stackoverflow.com/questions/48087/select-n-random-elements-from-a-listt-in-c-sharp – msitt

答えて

1
var numberOfRandomSelections = 2; 

var randomRenderers = Enumerable.Range(0, LargeBeamObject.Count) 
     .OrderBy(i => Random.value) 
     .Select(i => LargeBeamObject[i].GetComponent<MeshRenderer>()) 
     .Take(numberOfRandomSelections); 

foreach(var renderer in randomRenderers) 
    renderer.enabled = true; 

説明:

  • は2つだけ最初のレンダラー
  • を取り、各インデックスの
  • 選択メッシュレンダラ

    1. は、オブジェクトリスト内のすべてのインデックスのための番号を生成
    2. シャッフルインデックス
  • +0

    @ScottChamberlainありがとう、Unityランダムで更新されました –

    +0

    返信いただきありがとうございますが、私はプログラミングで私の低いスキルのためにどのように動作するかを理解することができませんでした。私は初心者です。上記のSailesh Chowdaryのソリューションを使用しました。 – Tomas

    +0

    @TomasあなたはSailsのソリューションにバグがあることを理解しています - それは 'LargeBeamObject'リストからオブジェクトを削除しますか? –

    0

    新しい一時リストにデータを保存し、そのリストから選択した要素を削除します。

    void LargeBeamPlayerGenerator(){ 
    List<GameObject> tempObj = LargeBeamObject; 
        for (int i = 0; i < 2; i++){ 
         int randomGameObject = Random.Range(0,4-i); 
         GameObject selectedGameObject = tempObj[randomGameObject]; 
         MeshRenderer visible = selectedGameObject.GetComponent<MeshRenderer>(); 
         visible.enabled = true; 
         tempObj.RemoveAt(randomGameObject); 
        } 
    } 
    
    0
    int last = -1; 
    int randomGameObject; 
    for (int i = 0; i < 2; i++){ 
        while(randomGameObject = Random.Range(0,4) == last) {} 
        last = randomGameObject; 
        GameObject selectedGameObject = LargeBeamObject[randomGameObject]; 
        MeshRenderer visible = selectedGameObject.GetComponent<MeshRenderer>(); 
        visible.enabled = true; 
    } 
    
    関連する問題