我希望生成随机数而不重复,直到全部消失,然后再次使用初始数据集生成随机数。
我知道在数组中保留已生成的数字并循环遍历它们以检查它是否已生成alredy或者方法是从数组中生成的数字中扣除数字并使用新数组随机化数字。
我想要的不是那些方法,如果有一种方法有效使用数据结构将是相当不错的,如果它是任何其他方法也可以
由于
答案 0 :(得分:0)
我不确定您使用的语言是什么,但这里有一些C ++代码能够满足您的需求。它不是搜索数组,而是直接检查内存的特定部分是否有设置标志,如果没有设置,则选择的数字是新的并打印出来。
我标记为处理程序的部分是找到唯一编号时首先执行的代码。如果你想要一组更大的随机数,你可以将10和11改为不同的数字,但你可能需要永远等待输出。
int main(int argc, char *argv[]){
char randn[10];
char randnset[10];
int n;
int ct=0;
memset(randnset,'1',10);
memset(randn,0,10);
while (ct < 10){
srand(time(NULL));
n=rand() % 11;
if (!randn[n]){
printf("%d\n",n); // handler
randn[n]='1';
ct++;
}
}
return 0;
}
答案 1 :(得分:0)
每个随机生成器函数都将种子值作为参数,并在其内部算法中使用它来生成随机数。如果要生成相同的数字序列,则必须使用相同的种子值。举个例子,你可以用Java实现这个:
int seed = 10;
Random r = new Random(seed);
for(int i=0; i<10; i++){
System.out.println(r.nextInt());
}
输出是这样的(当然它会在你的系统中产生不同的结果):
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428
每次执行时都会给我相同的结果。
答案 2 :(得分:0)
假设您要生成1,000个唯一的随机数,并将它们一次呈现给一些代码。当您耗尽这些数字时,您希望再次显示相同的数字,但顺序不同。
要生成数字,请使用哈希表。在C#中,它看起来像这样:
const int MaxNumbers = 1000;
HashSet<int> uniqueNumbers = new HashSet<int>();
Random rnd = new Random();
// generate random numbers until there are 1000 in the hash table
while (uniqueNumbers.Count < MaxNumbers)
{
uniqueNumbers.Add(rnd.Next());
}
// At this point you have 1,000 unique random numbers
// Put them in an array
int[] myNumbers = uniqueNumbers.ToArray();
这是有效的,因为HashSet.Add
方法拒绝重复。它非常快,因为哈希表中的查找是O(1)。
现在,您可以通过将当前索引设置为0来为它们提供服务,并在每次请求数字时将其递增。类似的东西:
int ixCurrent = 0;
int GetNextNumber()
{
if (ixCurrent < MaxNumbers)
{
++ixCurrent;
return myNumbers[ixCurrent-1];
}
但是ixCurrent
在数组末尾运行时该怎么办?输入Fisher-Yates Shuffle:
// out of numbers. Shuffle the array and return the first one.
for (int i = MaxNumbers-1; i > 0; --i)
{
int j = rnd.Next(i+1);
int temp = myNumbers[i];
myNumbers[i] = myNumbers[j];
myNumbers[j] = temp;
}
ixCurrent = 1;
return myNumbers[0];
}
如果您知道要返回的数字在特定范围内(也就是说,您希望以随机顺序返回数字0-999),那么您只需使用值0-999和shuffle填充数组它