在随后的脚本运行中随机生成4或5位数字的唯一代码

时间:2018-08-10 11:17:42

标签: python perl random

我需要生成10个4或5位唯一数字。 我可以使用Python / Perl做到这一点,但是同一脚本每天都会运行以生成10个随机数。 所以我不想他们重复。如果我随机生成它们,则它们可能会重复出现。

请提出建议。

5 个答案:

答案 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高尔夫,并使它更紧凑,但是我在这里读起来比较清晰。