【问题标题】:php random number function returning same value each time is calledphp随机数函数每次调用都返回相同的值
【发布时间】:2017-09-09 12:12:57
【问题描述】:

我正在尝试生成任何长度的随机数,我想制作产品 ID 和订单 ID。但是这里的问题是,当我创建新项目时,它给出了 id 11 的长度,它会在不改变数字之前生成相同的 id 使用。

这是我的 php 代码

<?php
function EventRang($length = 10, $type){
    switch($type){
        case 'int':
        //$keyspace = mt_rand(10000000000, 99999999999).date("Ymd").rand();
        $keyspace = str_pad(rand(0, pow(10, $length)-1), $length, '0', STR_PAD_LEFT);
        break;
        case 'char':
        $keyspace = date('Fl').'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        break;
        case 'str':
        $keyspace = time().'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        break;
        case 'oid':
        //$keyspace = date("Ymd").time().rand().mt_rand(10000000000, 99999999999);
        $keyspace = date("Ymd").time().str_pad(rand(0, pow(10, $length)-1), $length, '0', STR_PAD_LEFT);
        break;
        default:
        $keyspace = time().'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        break;
    }
    $charactersLength = strlen($keyspace);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $keyspace[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
?>

这始终是输出2147483647

【问题讨论】:

  • pow(10,11) 超过 32 位数字
  • 2147483647 是一个你应该学会识别的神奇数字;它是 32 位 PHP 的最大有符号整数值
  • @MarkBaker 请帮助修复它,我是 php 新手,我现在能做的只是我不知道那个神奇的数字
  • oid 值应该返回什么字符?您似乎是在定义“掩码”而不是“键空间”,即有效字符列表.... 将键空间简单地设置为有效字符列表可能更好,然后执行您可能想要的任何特殊格式生成随机值
  • @MarkBaker for oid 我想使用当前日期和时间,然后在末尾添加随机数 date("Ymd").time()4488765。请帮我以正确的方式修复它,我将有时间查看并了解更多信息

标签: php for-loop random


【解决方案1】:

因为有时答案需要明确

function EventRang($length = 10, $type = 'int') {
    // Define the set of characters permitted for the random element for each type
    switch($type) {
        case 'int':
        case 'oid':
            $keyspace = '0123456789';
            break;
        case 'char':
            $keyspace = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            break;
        case 'str':
        default:
            $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    }

    // Generate the random characters/digits
    $charactersLength = strlen($keyspace);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $keyspace[rand(0, $charactersLength - 1)];
    }

    // apply the masking
    switch($type) {
        case 'int':
            return $randomString;
        case 'char':
            return date('Fl').$randomString;
            break;
        case 'str':
            return time().$randomString;
            break;
        case 'oid':
            return date("Ymd").time().$randomString;
            break;
        default:
            return time().$randomString;
    }
}

您需要将掩码与键空间分开;键空间只是用于输出的随机元素的字符集;如果您尝试将屏蔽作为键空间的一部分应用,那么您只是在扭曲随机性,而不是应用屏蔽。

还要注意,函数定义也需要类型的默认值,因为它在参数列表中的长度之后,而长度有一个默认值

【讨论】:

  • int,现在工作得很好,但其他一次返回超过给定值。我想我知道为什么因为制作让我尝试修复它
  • 如果该值太长,则在返回之前对其进行子串化......我不知道您是否想要除了掩码之外的11个随机数字,还是包括掩码
  • 虽然我会说char 的日期掩码很奇怪; oid 的值 11 不会产生太大变化,因为 date("Ymd").time() 已经超过 11
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多