2017-04-19 57 views
-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

當選擇第二,重試,如果它選擇相同。或者在選擇第二個選項之前從選項中刪除第一個選擇。這麼多可能性。 – CSharpie

+0

從列表中刪除第一個選擇,然後再次選擇新的列表長度-1作爲Random.Range的第二個參數。這是Unity嗎,順便說一句?應該標記它,如果是的話。 –

+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; 

說明:

  1. 生成所有索引號碼的對象列表中
  2. 隨機指標
  3. 每個索引選擇網格渲染
  4. 只取兩個第一渲染
+0

@ScottChamberlain謝謝,隨Unity Unity更新 –

+0

感謝您的回覆,但由於編程技巧低下,我無法弄清楚它是如何工作的。我是一名初學者。我使用了上面發佈的Sailesh Chowdary的解決方案。 – Tomas

+0

@Tomas你明白Sailesh解決方案有bug - 它從'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; 
}