hayai 你怎么知道你的程序不会重复?我觉得你的程序一定会出现重复的整数阿,aryAll[i] = aryAll[ind];如果ind=0,i=0,aryAll[0]=0,temp=0,如果ind=4,i=0,aryAll[4]=4,temp=0??自己都不知道说些什么了,反正你的步骤不能让人服气(如不出说明的话),所以请你写一份证明材料给大伙看看,让我们大家服气才好啊,行动要快哦~~~~
调试欢乐多
selecting n number in integers [0, m).
if n > m,肯定要有重复,所以不讨论。if n <= m,就像在一副牌里拿n张,一定不会重复的。
To:star821116,我实在是认为用set太慢。每一次都要判断,然后如果set里已经有了,就要在random一次。如果,n = m; 那么,当你取n个数字时,死定了。有没有听过bogo sort(random sort)?可能,你“永远”都取不到这最后一个数字。当然啦,永远是不可能的。不防你写个程序试试。n = m = 100 好了。
To:keybook,不想回答你的问题,对牛弹琴。
public class Shuffler
{ // condition: selecting n int from 0-m when n is close to m.
private static int m_intTotal = 0;
private static int m_intPoint = 0; public static void initialize(int total)
{
initialize(total, 0);
}
public static void initialize(int total, int min)
{
m_intTotal = total;
if (m_intTotal > 0)
{
m_intPoint = 0;
m_aryValue = new int[m_intTotal];
for (int i = 0; i < m_intTotal; i++)
m_aryValue[i] = i + min;
}
} public static int random()
throws RuntimeException
{
if (m_aryValue == null)
throw new RuntimeException("Shuffler is not initialized");
if (m_intPoint == 0)
randomize();
int value = m_aryValue[m_intPoint];
m_intPoint = (m_intPoint + 1) % m_intTotal;
return value;
} /////////////////////////////////////////////////////////////////////////// private static int[] m_aryValue;
private static void randomize()
{
for (int i = 0; i < m_intTotal; i++)
{
int ind = (int)(Math.random() * m_intTotal);
swap(i, ind);
}
}
private static void swap(int a, int b)
{
int temp = m_aryValue[a];
m_aryValue[a] = m_aryValue[b];
m_aryValue[b] = temp;
}
}