随机代号怀疑

时间:2010-09-15 05:55:21

标签: php random

是否有任何方法可以避免随机数生成中的重复。

我想为特殊目的创建一个随机数。但它应该是一个独特的价值。我不知道如何避免重复的随机数

即,首先我得到了像1892990070这样的随机数。我创建了一个名为随机数的文件夹(1892990070)。我的目的是将来永远不会得到那个号码。我这样我的文件夹中有重复的随机数。

5 个答案:

答案 0 :(得分:3)

随机数字序列总是可以重复数字。您必须记录已使用的数字,以便在已使用的情况下重新生成该数字。像这样:

$used = array(); //Initialize the record array. This should only be done once.

//Do like this to draw a number:
do {
  $random = rand(0, 2000);
}while(in_array($random, $used));
$used[] = $random; //Save $random into to $used array

我上面的示例当然只适用于单个页面加载。如果它在页面加载中应该是静态的,则必须使用会话(对于单个用户)或某种类型的数据库(如果它对所有用户都是唯一的),但逻辑是相同的。

答案 1 :(得分:1)

您可以为mt_rand编写一个包装器,它会记住之前生成的所有随机数。

function my_rand() {
        static $seen = array();
        do{                                                                                                                                                                                                    
                $rand = mt_rand();
        }while(isset($seen[$rand]));
        $seen[$rand] = 1;
        return $rand;
}

答案 2 :(得分:0)

这将生成一个字符串,每个数字出现一次:

$randomcharacters = '0123456789';
$length = 5;
$newcharacters = str_shuffle($randomcharacters);
$randomstring = substr($newcharacters, 0, $length);

答案 3 :(得分:0)

您出于什么目的生成随机数?如果你正在做一些产生有限集的随机“选择”的东西,比如使用随机数函数对一副牌进行洗牌,那么最简单的就是把这个集合放到一个数组中:

$set = array('one', 'two', 'three');

$random_set = array();

while (count($set)) {
    # generate a random index into $set
    $picked_idx = random(0, count($set) - 1);
    # copy the value out
    $random_set []= $set[$picked_idx];
    # remove the value from the original set
    array_splice($set, $picked_idx, 1);
}

如果要为事物生成唯一键,则可能需要哈希:

# hold onto the random values we've picked
$already_picked = array();

do {
    $new_pick = rand();
# loop until we know we don't have a value that's been picked before
} while (array_key_exists($new_pick, $already_picked));

$already_picked[$new_pick] = 1;

答案 4 :(得分:0)

当重复出现问题时,记住以前生成的数字并创建新数字的想法是一个有用的通用解决方案。

但你确定最终的重复确实是一个问题吗?考虑掷骰子。有时它们重复相同的值,即使是两次连续抛出。没有人认为这是一个问题。

如果你有一个选择随机数的控制需求 - 比如洗牌一副牌 - 有几种方法。 (我看到有几个最近发布的答案。)

另一种方法是使用数字0,1,2,..., n 并以某种方式修改它们,如Gray Code encoding或通过常量位模式进行异或运算