【问题标题】:2 Random selections from one list - C#2 从一个列表中随机选择 - C#
【发布时间】:2017-04-19 20:21:59
【问题描述】:

我正在尝试从列表中随机选择两个项目。然后将这些项目设置为在场景中可见。问题是,有时它会选择在上一个循环中选择的那个。

如何排除第一个选择?

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 作为 Random.Range 的第二个参数。顺便说一句,这是 Unity 吗?如果是这样,应该标记它。
  • 您也可以随机重新排列列表,然后取出前两项。但是,如果该答案的评论者知道他们在说什么,那么 msitt 的解决方案似乎是合理的。

标签: c# list unity3d random


【解决方案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. 只使用两个第一个渲染器

【讨论】:

  • 感谢您的回复,但由于我的编程技能不高,我无法弄清楚它是如何工作的。我是初学者。我使用了上面发布的 Sailesh Chowdary 的解决方案。
  • @Tomas 你明白 Sailesh 解决方案有错误 - 它从 LargeBeamObject 列表中删除对象?
  • 是的,我发现了,但无论如何它对我有所帮助,而且我走得更远了。但你是对的,它并没有解决我所说的问题。
  • @Tomas 它没有解决问题,但它仍然被接受为答案:) 哈哈顺便说一句,你为什么不尝试 LINQ 方法?
【解决方案2】:

将数据保存到新的临时列表中并从该列表中删除选定的元素。

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);
    }
}

【讨论】:

    【解决方案3】:
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 2023-01-11
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多