如何从1到50有效地选择几个独特的随机数,不包括x?

Coc*_*ico 3 random objective-c

我有2个数字这是0和49之间让我们给他们打电话xy.现在我想得到一些不是x或y的其他数字,但也介于0和之间49(我正在使用Objective C,但这更像是一个普遍的理论问题吗?).

我想到的方法是:

 int a;
 int b;
 int c;

 do {
  a = arc4random() % 49;
 } while ((a == x) || (a == y));

 do {
  b = arc4random() % 49;
 } while ((b == x) || (b == y) || (b == a));

 do {
  c = arc4random() % 49;
 } while ((c == x) || (c == y) || (c == a) || (c == b));
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎有点不好,我不知道,我只是想学习成为一名更好的程序员,最佳做法是什么才能做到这一点?

LBu*_*kin 9

你可以使用一种名为Fisher-Yates shuffle的东西.这是一种从一些集合中生成随机排序的值列表的有效算法.您将首先从要获取随机值的值列表中排除N,然后执行shuffle.


Chr*_*ung 5

你应该洗牌数字数组(值[0,...,49]在你的情况,你也可以排除你xy这个数组,如果你已经知道它们的值),然后抓住前N值(无论多少你从洗牌阵列中寻找.这样,所有数字都是该范围的随机数,而不是"之前见过".