2012-06-03 108 views
-3

这是我的家庭作业:使用随机数发生器整数随机排列

Random r = new Random(); 
public int get100RandomNumber() { 
    return 1+r.nextInt(100); 
} 

给你一个预先定义的函数命名getrand100()(以上)的 返回一个整数,这是一个从1-100的随机数。您可以根据需要多次拨打 此功能,但请注意,此功能 相当耗费资源。您不能使用任何其他随机 生成器。您不能更改getrand100()的定义。

输出:以随机顺序打印1-20号码。 (不是20个随机数)

我已经试过..

public class MyClass { 

    static Random r = new Random(); 
    static HashSet<Integer>; 

    public static void main(String args[]) { 
     myMethod(); 
     System.out.println(s); 
    }  

    public static void myMethod() { 
     boolean b = false; 
     s = new HashSet<Integer>(); 
     int i = getRand100(); 
     if (i >= 20) 
      i = i % 20; 
     int j = 0; 

     int k, l; 
     while (s.size() <= 20) 
     { 
      System.out.println("occurence no" + ++j); 
      System.out.println("occurence value" + i); 
      b = s.add(i); 
      while (!b) { 
       k = ++i; 
       if(k<=20) 
        b = s.add(k); 
       if(b==true) 
        break; 
       if (!b) { 
        l = --i; 
        if(i>=1&&i<=20) 
         b = s.add(l); 
        if(b==true) 
         break; 
       } 
      } 
     } 
     System.out.println(s); 
    } 

    public static int getRand100() 
    { 
     return r.nextInt(100) + 1; 
    } 
} 

感谢您的帮助!

+1

-1 http://www.emilvikstrom.se/whyidownvote.html(你有什么尝试?) –

+0

你是说,如果你得到一个数字x使得x == 0或x> 20,你有拒绝它? – Makoto

+0

yes just ...... –

回答

2

我相信你问的是如何使用随机数发生器以随机顺序打印出数字1到20。这也被称为“随机排列”。 Fischer-Yates shuffle就是这样一种算法。但是,要实现该算法,首先需要一个随机数生成器,它可以从N个项目中选择一个,其概率为N,其中N的范围从2到该组的大小,以便洗牌,而只有一个可以以相同的概率从100个项目中选出一个项目。这可以通过模算术和“再滚动”的组合来轻松获得。

+0

也许他只需要一个数值为1到20的数组,然后使用他所具有的随机函数应用Fishcer-Yates shuffle算法。为了利用这个shuffle函数的时间,数组可以有1到20个元素(我想)。 –

1

假设你可以使用ArrayList类,我建议用你想要的数字填充一个列表(在这种情况下是1到20),然后随机从列表中选择数字并将其删除。使用getRand100() % theList.size()应该足够随机为您的原因,你只需要调用它19次。当只剩下一个元素时,不需要“随机”从列表中选择它。 ;-)

+0

我认为这可能与@Weeble在其他答案中提出的Fisher-Yates shuffle相同。从来不知道这实际上有一个“官方”的名字,因为我很早以前就已经提出了它的名字,并且从来没有打扰过查看它,因为我发现它很“明显”。 – Wormbo

0

我相信我已经想出了一种方法来转换1和n之间的任何数字! (假设项目的数量已知)到n个项目的唯一排列。

实质上,这允许对整个卡组进行“即时”随机化,而无需使用任何洗牌算法。目前,它运行在O(n^2)并且需要使用BigInteger软件包(即Java或Javascript),但我正在寻找优化运行时的方法(尽管如此,老实说,2500次迭代现在无论如何都不算​​什么)。无论如何,当给定至少226比特的有效随机数据时,该函数能够在10毫秒内生成52个整数的混洗阵列。

该方法类似于用于将十进制数转换为二进制数(连续除以2等)的方法。我很乐意根据要求提供我的代码;我觉得有趣的是我之前没有遇到过它。