Algorithm 随机数列表

Algorithm 随机数列表,algorithm,Algorithm,我需要生成一个数字列表(大约120)。数字范围从1到X(最多10),两者都包括在内。算法应该对每个数字使用相同的次数,或者至少尝试一下,如果一些数字少用一次,那就好了 这是我第一次做这种算法,我曾经做过一次非常简单的算法,但是我被如何做这个问题难住了。我首先尝试了谷歌搜索,虽然我真的不知道这种算法叫什么,所以我什么也找不到 非常感谢 听起来你要做的是先用你想要的数字填充一个列表,然后再将该列表洗牌。一种方法是将您的每个号码添加到列表中,然后重复该过程,直到列表中包含您想要的项目。然后,随机洗牌列

我需要生成一个数字列表(大约120)。数字范围从1到X(最多10),两者都包括在内。算法应该对每个数字使用相同的次数,或者至少尝试一下,如果一些数字少用一次,那就好了

这是我第一次做这种算法,我曾经做过一次非常简单的算法,但是我被如何做这个问题难住了。我首先尝试了谷歌搜索,虽然我真的不知道这种算法叫什么,所以我什么也找不到


非常感谢

听起来你要做的是先用你想要的数字填充一个列表,然后再将该列表洗牌。一种方法是将您的每个号码添加到列表中,然后重复该过程,直到列表中包含您想要的项目。然后,随机洗牌列表

在伪代码中,生成初始列表可能如下所示:

list = []
while length(list) < N
    for i in 1, 2, ..., X
        if length(list) >= N
            break
        end if
        list.append(i)
    end for
end while
list=[]
而长度(列表)=N
打破
如果结束
列表.附加(i)
结束
结束时
我把洗牌部分留给读者作为练习

编辑: 正如在评论中指出的那样,上面提到的小数字总是比大数字多。如果这不是期望的,您可以按随机顺序迭代可能的数字。例如:

list = []
numbers = shuffle( [1, 2, ..., X] )
while length(list) < N
    for i in 1, 2, ..., X
        if length(list) >= N
            break
        end if
        list.append( numbers[i] )
    end for
end while
list=[]
数字=洗牌([1,2,…,X])
而长度(列表)=N
打破
如果结束
列表.追加(编号[i])
结束
结束时

我认为这应该消除这种偏见。

你想要的是一个均匀分布的随机数。这意味着,如果您在1到10之间生成10个数字,那么列表中很可能存在所有1到10的数字

java中的Random()类提供了相当统一的分布。那就去做吧。要进行测试,只需检查以下内容:

Random rand = new Random();
for(int i=0;i<10;i++)
   int rNum = rand.nextInt(10);
Random rand=new Random();

对于(int i=0;i创建一个包含所有必要数字的列表,然后将它们洗牌a-la Fisher–Yates:几乎每种语言都有一个库函数来提供伪随机数。是否需要从头开始实现算法?无需重新发明轮子。只需使用nextInt()函数(java)。它提供了相当均匀的数字分布,正如您所希望的。只需列出1,2,3…X,1,2,…X,1,2…直到您得到120个符合您要求的数字。大多数答案都假设您需要随机数或分布。不幸的是,这是不可能的;随机分布将无法满足您的要求,即算法尝试使用每一个数字次数相等。您可以随机排列序列1,2,3…X,1,2,…X,1,2…但这不是“随机”数字序列,因为并非所有可能的序列都具有相同的可能性,甚至是可能的。但就您可能真正想要做的事情而言,这可能是最好的解决方案。这会偏向较小的数字,至少在上一次迭代中是这样的,对吗?(在1和8之间生成10个数字将始终为您提供2个1和2个2,以及其他所有数字中的1)是的,确实如此。OP不清楚这是否重要(他们希望每个人的人数相等)。如果这是一个问题,一个选项是在将可用数字添加到列表中时,以随机顺序迭代可用数字。
这意味着如果生成10个介于1到10之间的数字,则列表中很可能存在所有1到10的数字。
此声明是错误的。所有10个数字的概率都是to在10的列表中是10!/10^10~=0.00036好的,genius,请先正确阅读!这意味着:P(nextInt()将生成均匀分布)~1.nextInt()函数是专门为创建这种均匀分布而编写的。因此,即使在整个样本空间中可能发生的方式的数量较少,概率也很高。想想一个正面多于反面的有偏硬币。P(T)在这种情况下,仍然是1/2?这是一个完美的半生不熟的数学例子!一些白痴也同意你的观点。.我的观点不是它“小于”整个样本空间。它比整个样本空间小得多。例如,如果你从U[1,2]中只画出2个均匀分布的数字,你可以得到4个列表:[1,2],[2,1],[1,1],[2,2]。每个列表都有相同的被“选中”的概率(1/4)。因此,获得所需列表的概率只有0.5(
p([1,2])+p([2,1])=0.5
)。这不是很高的概率。随着列表变长,情况会变得更糟。现在,我为您制作了一个微基准,运行它并检查结果:Random rand=new Random(5);int[]expected={0,1,2,3,4,5,6,7,8,9};int corrects=0;for(int t=0;t<1000000;t++){int arr[]=new int[10];for(int i=0;ith nextInt()函数不会简单地从[1,2]、[2,1]、[1,1]、[2,2]样本空间中选择“any”数字。因此,如果它已经选择了1,它会非常倾向于选择2(而不是再次选择1)如果它已经选择了2,它高度倾向于选择1(而不是再次选择2)。因此,从总样本空间来看,如果你运行该函数1000次,那么在990次(比如)中,你将得到[1,2],[2,1]样本将概率“转移”到均匀分布。概率偏向于创建均匀分布作为输出。这些是在程序中创建随机变量的基础。