【问题标题】:How can I always have a different random phrase selected when using a random? [duplicate]使用随机词时,如何始终选择不同的随机词组? [复制]
【发布时间】:2017-08-04 16:10:50
【问题描述】:

我有这个代码:

public async Task ShowTimedCard()
{
   phrase = phrases[(int)AS.rand.Next(phrases.Count)];

它获取一个随机数,然后从phrases 中选择一个短语,该短语是phrase 行的列表。该列表具有由后台进程添加和删除的项目。

每个短语都有一个Id 字段。由于其他原因,我无法从列表中删除我使用过的短语。

有时 ShowTimedCard 会连续两次选择相同的短语,因此我决定将 lastPhrase 信息存储在一个静态变量中,如下所示:

AS.phrase.id = phrase.id

如果phrases 列表中有超过 1 个项目,我该如何做到这一点,那么它不会连续两次选择相同的短语?我正在考虑某种 while 循环或 until 循环,但不知道如何实现它。我猜它需要将phrase.Id与AS.phrase.id进行比较

【问题讨论】:

  • 从列表中删除使用的短语?
  • 您要么需要从列表中删除使用过的短语,如@Equalsk 所说,要么检查所选短语是否已被使用。如果有,请选择另一个短语。
  • 正如@Equalsk 所说,我想补充一下。使用您的短语的副本并从该副本中删除
  • 另一种选择是按随机顺序对短语进行排序,然后循环遍历它们。
  • 如果您不能连续两次选择相同的值,您正在寻找shuffle

标签: c#


【解决方案1】:

显示你创建 rand 的位置

你应该只创建一次并重复使用它

我敢打赌,您正在创建新的并且没有足够的刻度来获得新种子

好的,我可能错过了这个问题

只需使用 Yates shuffle 随机播放列表

这是字节,但你明白了

for (byte i = (byte)(count - 1); i >= 1;  i--)
{
    byte k = (byte)rand.Next(i + 1);
    if (k != i)
    {   // exchange the values 
        curVal  = deck[i];
        deck[i] = deck[k];
        deck[k] = curVal;
    }
}

或者将使用的 id 存储在一个 hashset 中

Random rand = new Random();
HashSet<int> hs = new HashSet<int>(); 
int next;
while (hs.Contains(next = rand.Next(12))) { }
hs.Add(next)

移动目标

while (next = rand.Next(12) == lastNext) { }
lastNext = next;

【讨论】:

  • 有时列表中只有三个项目。这就是为什么很容易两次获得相同的物品。但是如果发生这种情况,我需要以某种方式重新选择它。不知道该怎么做。
  • 抱歉,我更新了问题以更清楚。如果连续两次,这只是一个问题。这就是为什么我希望能够通过存储最后一张牌并与下一张牌进行比较来做一些事情,如果相同,然后再做另一张随机选牌等等。
  • 伙计,你是一个移动的目标
  • @Alan:你似乎很清楚你想做什么。是什么阻止您进行检查和重复?
  • 我不知道如何实现检查和重复。如果我不再想要相同的 ID,狗仔队的解决方案很有用,但这比我需要的要多得多。我只想重新选择它是否与最后一个短语相同。我确实更新了问题并将其以粗体显示,以尽可能清晰。
【解决方案2】:

听起来你真正想要做的是随机排序列表,然后你可以只取连续的项目。这将确保您在显示所有其他项目之前看不到任何项目,但它们不会按照添加的顺序显示:

// Shuffle our list of phrases, so they're in a random order
var rnd = new Random();
phrases = phrases.OrderBy(p => rnd.NextDouble()).ToList();

然后,您可以随时重新排列列表,例如添加新项目或到达列表末尾时。

这是一个使用整数的快速演示:

// Create a list of consecutive integers and display it
var numbers = Enumerable.Range(1, 30).ToList();
Console.WriteLine("Original list:");
Console.WriteLine(string.Join(", ", numbers));

// Shuffle the list and display it again
var rnd = new Random();
numbers = numbers.OrderBy(n => rnd.NextDouble()).ToList();
Console.WriteLine("\nShuffled list:");
Console.WriteLine(string.Join(", ", numbers));

输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2023-01-27
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多