PHP-Don';t重复随机选择

PHP-Don';t重复随机选择,php,Php,我有一个小PHP脚本,它从数组中选择一个随机句子 $prefixes = array('sentence 1', 'sentence 2'); echo $prefixes[rand(0,count($prefixes)-1)]; 我怎样才能让它不连续两次挑同一个句子呢 编辑:对不起,是的,大约有100个句子,它们可以反复使用,只是不能连续使用两次。这是一个点击事件,使用AJAX将句子重新加载到页面上,如果它连续两次选择同一个句子,则看起来单击按钮没有做任何事情,因为没有页面刷新。谢谢 编辑

我有一个小PHP脚本,它从数组中选择一个随机句子

$prefixes = array('sentence 1', 'sentence 2');

echo $prefixes[rand(0,count($prefixes)-1)];
我怎样才能让它不连续两次挑同一个句子呢

编辑:对不起,是的,大约有100个句子,它们可以反复使用,只是不能连续使用两次。这是一个点击事件,使用AJAX将句子重新加载到页面上,如果它连续两次选择同一个句子,则看起来单击按钮没有做任何事情,因为没有页面刷新。谢谢


编辑2:基本上它是一个DIV,在中有一个句子,当你点击一个按钮时,它通过AJAX将一个新句子加载到DIV中,并用新句子替换旧句子。有时,它会连续两次加载同一个句子,这就产生了这样的效果:按钮什么也没做

您需要编写一个新函数。记录以前的
rand()
结果,并对照它检查当前结果。当这两个值相同时,请再次调用
rand()

好的,您可以使用:

然后,每次使用后将其取出:

$prefix = array_pop($prefixes); // Removes the element when it returns
或递增数组:

$prefix = current($prefixes); // fetches the current element
next($prefixes); //increments the internal array pointer

好吧,我不知道你想做什么,但我会试试:你想从一系列随机且唯一的句子中选择一些句子吗

// version 1: shuffle!
shuffle($sentences);
$result = array_slice($sentences, 0, NUMBER_OF_SENTENCES);

// version 2: array_rand!
// a) $result will contain the INDEX in the entry in the $sentences array.
$result = array_rand($sentences, NUMBER_OF_SENTENCES);
// b) $result will contain the sentences
$result = array_rand(array_flip($sentences), NUMBER_OF_SENTENCES);

当然,请确保在
$prefixes
中有多个元素,否则它将陷入无限循环。

由于您是通过Ajax加载的,因此只需在Ajax调用中传递句子索引号,以防止同一句子连续出现两次。返回句子时,请返回句子本身及其索引。请求新句子时,传递旧句子索引。不要乱序数组本身,这样您可以在请求之间识别相同的句子。

如果一个句子不连续,是否可以再次使用?我想您的数组中有两个以上的句子,因为目前唯一的解决方案是:
1 01 01 01 0
次要点,但如果您确定哪些可以拾取,哪些不可以拾取,它不会是随机的,对吗?哈哈,是的,但请看我上面的编辑,有一个特定的原因,它不一定是真正随机的。我宁愿使用array\u pop来获得更好的性能。根据这个链接数组,它的速度至少快1000倍。公平点。你可以用pop来代替(因为它在语义上是一样的,因为顺序并不重要)…移除它们是永久地移除它们,还是仅仅直到洗牌重新开始?你是什么意思?你到底想干什么?如果我理解你(我不理解),试着用
echo array\u pop($prefixes)替换
echo
。。。或使用
回波电流($prefixes);其次($前缀)取决于你想做什么…这个答案实际上并没有解决这个问题。(见他的编辑)他使用AJAX在每页加载一句话。
// version 1: shuffle!
shuffle($sentences);
$result = array_slice($sentences, 0, NUMBER_OF_SENTENCES);

// version 2: array_rand!
// a) $result will contain the INDEX in the entry in the $sentences array.
$result = array_rand($sentences, NUMBER_OF_SENTENCES);
// b) $result will contain the sentences
$result = array_rand(array_flip($sentences), NUMBER_OF_SENTENCES);
session_start();
$prev = isset($_SESSION['last_number']) ? $_SESSION['last_number'] : null;
do {
  $_SESSION['last_number'] = mt_rand(0,count($prefixes)-1);
} while ($_SESSION['last_number'] === $prev);
echo $prefixes[$_SESSION['last_number']];