2017-04-19 56 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; 
}