【问题标题】:How can I add a random number to each item in foreach loop but to stay the same for 1 day如何在 foreach 循环中为每个项目添加一个随机数但保持 1 天不变
【发布时间】:2014-03-31 15:27:40
【问题描述】:

我正在尝试为 foreach 循环中的每个项目分配一个不同的随机数,但我希望该数字在一天内保持不变。

我尝试过简单地添加 <?php echo rand(0,20); ?>,但这显然只会在每次刷新时创建一个随机数。

无论如何,我可以将每个项目的相同随机数保留一天而不将其添加到数据库中。

例如:

item 1 = 2
item 2 = 18
item 3 = 13
item 4 = 6

1 天不变,然后改变

【问题讨论】:

  • 使用sessions而不是将它们插入DB
  • 使用实际生成任何随机数之前的日期播种随机数生成器
  • 我尝试添加会话,但每个号码都需要多个会话 - 我不知道该怎么做
  • 用你的随机数创建array,然后用sessions保存这个array
  • 你将如何在循环中执行此操作 - 抱歉有点菜鸟!

标签: php random numbers


【解决方案1】:

您可以通过编写自己的随机数生成器来做到这一点。 This guide shows you how to do it.

注意:以下代码来自sitepoint

class Random {

    // random seed
    private static $RSeed = 0;

    // set seed
    public static function seed($s = 0) {
        self::$RSeed = abs(intval($s)) % 9999999 + 1;
        self::num();
    }

    // generate random number
    public static function num($min = 0, $max = 9999999) {
        if (self::$RSeed == 0) self::seed(mt_rand());
        self::$RSeed = (self::$RSeed * 125) % 2796203;
        return self::$RSeed % ($max - $min + 1) + $min;
    }

}

叫它

// set seed
Random::seed(42);

// echo 10 numbers between 1 and 100
for ($i = 0; $i < 10; $i++) {
    echo Random::num(1, 100) . '<br />';
}

现在使用php date function根据当前日期设置您的种子

// set seed based on date with 
Random::seed(date("z") + 1);

这将为您提供每年相同的数字。如果您不想要这个,请使用 rubo77 的种子变量。使用此版本,您可以确保在不同的机器上获得相同的编号(不能保证使用 srand)。

【讨论】:

  • Random::seed(date("z Y") + 1) 不会每年给出相同的结果。
【解决方案2】:

也许您可以尝试以下方法:

$not_random_at_all = base_convert(md5($item . date('l jS \of F Y')), 16, 10);

$item 是您的商品编号(或任何标识该商品的信息)。

它只是将当前日期的 MD5-Hash 与您的项目编号连接起来转换为整数。

这意味着每天每件商品都有一个不同的随机数。

请记住,MD5 不是随机数生成器,您的结果可能会尽可能随机。

【讨论】:

  • 我不确定是否反对,但这似乎对我有用。但有一件事 - 我怎样才能使随机数更小?我想对随机数做一个 if 语句,但它们目前非常庞大
  • 你可以用crc32代替md5
  • 谢谢那肯定更小 - 我想最好是两位数
  • 如果您只使用 1 到 100 之间的数字,可能会有多个具有相同“随机”数字的项目。如果那样的话,它也根本不会提高应用程序的性能是您关心的问题。
  • 如果您仍然想要较小的数字,您可能需要使用取模运算符 (%)。
【解决方案3】:
$seed = floor(time()/86400);
srand($seed);
foreach($list as $item){
  echo $item.rand(0,20);
}

或在确定的时间间隔内获得相同的 rand 值。 另一个例子:你有一个包含 20 个元素的数组,你需要每天获取一个随机项目,但在 24 小时内不改变(想象一下“今天的照片”或类似的)。

$seed = floor(time()/86400);
srand($seed);
$item = $examplearray[rand(0,19)];

在 24 小时内每次加载页面时都会获得相同的值。

【讨论】:

  • 你会如何回应这个?
  • 那只会创建 一个 随机数,不是吗?他希望每个项目都有一个不同的随机数。
  • 在循环中:echo $item
  • 我又加了一个例子
猜你喜欢
  • 2015-09-28
  • 2022-01-11
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多