我想生成0到9范围内的四个随机数。使用Java Random类生成四个随机数很容易。
import React, { Component } from 'react';
export default class auth extends Component {
constructor(props) {
super(props)
const user = localStorage.getItem('user')
if(!user) {
window.location = '/login'
}
}
render() {
return (
<div></div>
);
}
}
有了这个,我可以轻松获得四个数字的数组, 9369 , 4702 等。 在这种情况下,可能有一个数字可以重复四个数字,我不希望这样重复。
在这里,我想让上面数组中的所有四位数都是唯一的,这样我就可以获得 9543 , 1234 等输出。
为此,我想到了以下方式。
有没有比上述方法更好的方法,以便我可以轻松快速地获得四个独特的随机数?
任何建议都表示赞赏。
答案 0 :(得分:32)
您可以使用Collections.shuffle
:
// generate a List that contains the numbers 0 to 9
List<Integer> digits = IntStream.range(0,10).boxed().collect(Collectors.toList());
// shuffle the List
Collections.shuffle (digits);
// take the first 4 elements of the List
int numbers[] = new int[4];
for(int i=0;i<4;i++){
numbers[i] = digits.get(i);
}
答案 1 :(得分:9)
你可以使用Set
,想法是生成你的随机数然后把它放在一个集合中并继续这样做,直到你的集合中有4个元素,完成后你将有4个唯一的随机数存储在您的集合中
Set<Integer> randomSet = new HashSet<>();
while(randomSet.size() <4)
randomSet.add //add your generated random number
答案 2 :(得分:7)
如果您可以创建一个快速函数f,将自然数映射到满足您要求的数字集,则只能生成一个随机数。然后你的运行时间受到f的限制。如果您可以创建一个相当快的f,这是最有效的方法。
最简单的解决方案是将满足条件的所有数字放在数组中,并创建一个随机数作为该数组的索引。 - &GT; O(1)
答案 3 :(得分:7)
如您所见,有很多方法可以达到目标。这是我的建议
Random random = new Random();
// prepare all valid digits
List<Integer> from = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9));
// take set in an random order
int numbers[] = new int[4];
for(int i = 0; i < numbers.length; i++){
numbers[i] = from.remove (random.nextInt (from.size()));
}
for (int num : numbers) {
System.out.println(num); // when you prefer this
}
答案 4 :(得分:0)
修改
由于Collections.shuffle也使用fisher-yates算法。但是这种变体正在选择序列的起点。 这就像洗牌一副牌,从中间选择4张牌,然后洗牌,从顶部选择4张牌。
以下是https://softwareengineering.stackexchange.com/questions/199644/efficient-way-to-shuffle-objects
中提到的Fisher-Yeats改组算法的变体 public int[] shuffle() {
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Random r = new Random();
for (int i = a.length; i > 1; i--) {
swap(a, i - 1, r.nextInt(i));
}
int[] result = new int[4];
// Variant :: Randomly choosing the starting point of the
// sequence, since we need only four number.
System.arraycopy(a, r.nextInt(a.length - 4), result, 0, 4);
return result;
}
private void swap(int[] a, int i, int i1) {
int temp = a[i];
a[i] = a[i1];
a[i1] = temp;
}
参考:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle