我需要生成10个4或5位唯一数字。 我可以使用Python / Perl做到这一点,但是同一脚本每天都会运行以生成10个随机数。 所以我不想他们重复。如果我随机生成它们,则它们可能会重复出现。
请提出建议。
答案 0 :(得分:0)
我建议您生成所有可能的4位和5位数字,将它们混洗(使用random.shuffle()),然后保存到文件中。然后您每天可以在10点之前摘下它们。
答案 1 :(得分:0)
只有三种方法可以保证获得10个从未有过的数字:
随机生成数字,但检查它们是否之前已生成。如果以前已经生成过一个数字,请重新生成它,然后重复检查。
使用少量数字,时间会变慢。
加密一个递增的数字流。
此解决方案需要最少的存储空间(仅是密钥和生成的数字),但这是最复杂的选项,如果密钥被泄露,它就会崩溃。
提前生成一个非重复的数字列表,然后从该列表中读取。
这是最快的方法,对于像您这样的一小部分数字,使用的磁盘空间可以忽略不计。
如果数字用尽,可以轻松扩展这三种方法。
以下是第三种方法的实现:
#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
use File::ReadBackwards qw( );
use List::Util qw( shuffle );
my $numbers_qfn = ...;
if (open(my $fh, '<', $numbers_qfn)) {
die("Can't open numbers file \"$numbers_qfn\": $!\n") if !$!{ENOENT};
open(my $fh, '>', $numbers_qfn)
or die("Can't create numbers file \"$numbers_qfn\": $!\n");
say $fh $_ for shuffle(1000..99999);
}
my $fh = File::ReadBackwards->new($numbers_qfn);
my @numbers;
while (@numbers < 10 && defined( my $line = $fh->readline )) {
chomp($line);
push @numbers, $line;
}
@numbers == 10
or die("Insufficient numbers remaining\n");
truncate($fh->get_handle, $fh->tell)
or die("Can't truncate numbers file \"$numbers_qfn\": $!\n");
say for @numbers;
答案 2 :(得分:-1)
如果要确保您的数字不会重复,只需生成一个数字列表,然后随机将其洗牌
import numpy as np
numbers = np.arange(100000) # Every number from 0 to 99999
np.random.shuffle(numbers) # Now we shuffled everything
这样,您便不会重复,因为每个数字都是唯一的。然后,您只需从头到尾访问numbers
数组中的数字
答案 3 :(得分:-1)
如果您对数字0、1、2、3,...进行加密,那么由于输入的唯一性,保证了加密输出的唯一性。显然,在将所有可能的5位数字用作输入后,必须重复此操作。
查看Format Preserving Encryption,以确保您的密码输出是五位数。
5位数字是10,000个值(14位)。假设安全性不是最重要的,那么一个简单的14位四轮Feistel密码,并带有少量的循环游动,应该是一个很好的基础。如果安全性很重要,那么您将需要更多诸如Hasty Pudding或AES-FFX之类的东西,但是不可避免地要花更多的时间来计算安全性。
答案 4 :(得分:-2)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="container-fluid">
<div class="row" style="height:10%;">
<div class="col-lg-12 col-md-12 bg-success">banner</div>
</div>
</div>
<div class="container-fluid">
<div class="row" style="height:80%;">
<div class="col-lg-2 col-md-2 bg-success">Menu</div>
<div class="col-lg-10 col-md-10 bg-warning">content</div>
</div>
</div>
<div class="container-fluid">
<div class="row" style="height:10%;">
<div class="col-lg-12 col-md-12 bg-success">footer</div>
</div>
</div>
</div>
</body>
</html>
我们可以打Perl高尔夫,并使它更紧凑,但是我在这里读起来比较清晰。