实际上不是随机的随机脚本


106

在办公室里有个小玩笑,有人想要一个脚本,随意选择一个名字,然后说这个人会喝一杯。

我们称他们为约翰,杰夫,艾玛,史蒂夫和朱莉。

我认为制作一个看上去一眼便是随机的脚本却很有趣,但实际上却总是将输出作为同一个人(取决于您选择的人)。

一周后投票得票率最高

最终获胜者是....

保罗·R(目前)158票。

这里的答案很好,如果其他人有其他想法尚未发布,请添加它们,我喜欢阅读它们。



6
@AstroCB是我的最爱之一。就在鲍比桌子后面。
Cruncher 2014年

50
如果它是随机的,那似乎会更狡猾,除了从不选一个人。
布伦丹·朗


3
我浏览了第一页:大多数答案总是选择John,第二高的是Julie,很少选择Jeff,而Steve则选择1。甚至Ray被一个人选中,但没人选择Emma。故事的寓意:当排队等候随机决定谁将购买饮料时,给自己起个名字爱玛。
悲惨的变量

Answers:


171

C

重要的是要尽快决定谁来购买,以免浪费宝贵的饮酒时间-因此,为了获得最佳性能,C是显而易见的选择:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    const char *buyer;
    int n;

    srand(time(NULL)); // make sure we get a good random seed to make things fair !
    n = rand();
    switch (n % 5)
    {
        case 0: buyer = "John";
        case 1: buyer = "Jeff";
        case 2: buyer = "Emma";
        case 3: buyer = "Steve";
        case 4: buyer = "Julie";
    }
    printf("The person who is buying the drinks today is: %s !!!\n", buyer);
    return 0;
}

说明:

如果break;在switch语句中的每种情况之后都有一个,这将很好地工作。但就目前情况而言,每种情况都“落到”下一种情况,所以可怜的朱莉总是以买酒为最终。


17
+1的性能-比滚动物理骰子快得多!;)
Jwosty 2014年

16
我正在考虑进一步优化它,也许使用SIMD或GPGPU,以获得更多性能。;-)
Paul

7
绝对真实适用。甚至没有人会怀疑这是偶然的事故。
iFreilicht

5
是我还是这太明显了?
Alvin Wong

3
@AlvinWong我没有立即注意到。再说一次,我不经常使用C或BCPL衍生的任何其他语言。
Rhymoid 2014年

164

的PHP

无法放手,所以这是另一个:

$f = fopen('/dev/random','r');
$s = fread($f, 4);
fclose($f);

$names = ['John', 'Jeff', 'Emma', 'Steve', 'Julie'];

echo $names[$s % count($names)];

实际上不能保证会产生约翰,但是机会非常大。PHP将很乐意采用/ dev / random所提供的任何内容,以使其(可能)无法解析它,并提出非常合理的数字0。毕竟,在PHP中警告程序员潜在的错误被认为是致命的罪过。


25
您一定喜欢PHP-甚至更好,它有时很少会选择其他人。所以,如果你是幸运的它看起来会有点偏,在第一
法尔科

142
+1000表示“ ...使程序员陷入潜在错误,这被认为是PHP的致命罪过。”
jsedano 2014年


85

哈斯克尔

如果它总是返回相同的名称,则太透明了,请尝试以下操作

import Control.Monad
import System.Exit
import Control.Concurrent
import Control.Concurrent.MVar


data Person = John | Jeff | Emma | Steve | Julie deriving (Show, Enum)

next Julie = John
next p = succ p

rotate :: MVar Person -> IO ()
rotate mp = modifyMVar_ mp (return . next) >> rotate mp

main :: IO ()
main = do
    mp <- newMVar John
    forkIO $ rotate mp
    putStrLn "Shuffling"
    readMVar mp >>= print
    exitWith ExitSuccess

每当您希望它是随机的:

[~]$ runghc prog.hs
Shuffling
Steve

[~]$ runghc prog.hs
Shuffling
Julie

对于您不幸的目标:

[~]$ runhugs prog.hs
Shuffling
John

[~]$ runhugs prog.hs
Shuffling
John

拥抱仅实现协作式多任务处理,因此rotate线程将永远不会运行


24
那是恶魔般的!
丹妮丝2014年

8
感觉就像拍摄尚未停止移动的骰子。
六。

1
@Vi。这是一个很好的类比。幸运的是,使用MVars可以确保图像不会模糊。:)
monocell 2014年

@monocell从技术上讲,即使是移动物体的照片也可以清晰显示。
ghosts_in_the_code

75

重击-最简单

一个非常简单的示例-让我们通过教科书的方式来避免任何问题。不要忘记从系统时钟中为生成器播种,以获得良好的结果!

#!/bin/bash

names=(John Jeff Emma Steve Julie)   # Create an array with the list of names
RANDOM=$SECONDS                      # Seed the random generator with seconds since epoch
number=$((RANDOM % 5))               # Pick a number from 0 to 4
echo ${names[number]}                # Pick a name

这取决于用户不知道$SECONDS内置函数的实际作用。它返回自当前shell启动以来的秒数。正如在脚本中一样,shell总是在零秒之前启动,因此生成器总是带有种子,0并且Julie总是购买啤酒。

奖金:

这个人经得起严格的审查。如果在命令行而不是在脚本中输入相同的代码,它将给出随机结果,因为$SECONDS它将返回用户的交互式外壳程序运行的时间长度。


9
\ o /意思是!!!实际意思!!!$SECONDStw!\ o /
yeti 2014年

如果您source执行此操作,而不仅仅是执行操作,会发生什么?shebang还会触发新的外壳或其他东西吗?
jpmc26 2014年

1
@ jpmc26:如果使用来执行,则与source您自己在命令行上键入命令的方式完全相同;#!/ bin / bash是注释,因此将被忽略。任何脚本都是如此。
暴动

57

C#

using System;
using System.Linq;

namespace PCCG {
    class PCCG31836 {
        public static void Main() {
            var names = new string[]{ "John", "Jeff", "Emma", "Steve", "Julie" };
            var rng = new Random();
            names.OrderBy(name => rng.Next());
            Console.WriteLine(names[0]);
        }
    }
}

这可能不会愚弄熟悉.Net API的人,但是不知道它的人可能会相信会OrderBy修改您调用的对象,这对于API的新手来说是一个合理的错误。


1
即使OrderBy假设地修改了对象,该调用实际上也会对列表进行随机排序吗?作为不熟悉.NET的人,我的第一个猜测是,由于rng.Next()仅被调用一次,因此该数组将按常量排序,而不会导致更改(或仅依赖于排序算法的更改)。
Brilliand 2014年

1
@Brilliand传递给OrderBy的参数不是静态值,它在每次对元素进行排序时都会执行,并且在这种情况下将返回随机值而不比较任何值。如果线路为names = names.OrderBy(name => rng.Next());
user3188175,2014年

1
=>指示,这是一个C#lambda表达式(闭合)。
Snowbody 2014年

44

电源外壳

$names = @{0='John'; 1='Jeff'; 2='Emma'; 3='Steve'; 4='Julie'}
$id = random -maximum $names.Length
$names[$id]

这将始终输出John

$namesSystem.Collections.Hashtable没有Length属性的。从PowerShell v3开始,Length(以及也可以Count)用作任何对象的属性。如果对象不具有该属性,则1在该对象不为null时将返回,否则将返回0。因此,在我的答案中,$names.Length计算结果为1,并且random -maximum 1始终返回0,因为最大值是互斥的。


42

show rand `John`Jeff`Emma`Steve`Julie;
exit 0;

Q总是用相同的值初始化其随机数种子。


8
所以基本上它不是随机在所有
山姆克里默

3
@SamCreamer这个问题的目的是使输出成为非随机的。但这看上去确实是随机的,因此它绝对符合要求
Cruncher 2014年

4
抱歉,我的意思是Q的随机数不是那么随机,这个问题确实符合条件。并不是要碰到那种方式!
Sam Creamer 2014年

是的,因此每次使用rand时,您都必须找到自己的方式来生成随机种子?听起来...有用。
DLeh 2014年

1
可以很容易地手动设置随机种子...使用-S 1234选项启动解释器,或\S 1234从解释器中进行操作
skeevey 2014年

34

佩尔

use strict;

my @people = qw/John Jeff Emma Steve Julie/;
my @index = int(rand() * 5);

print "Person @index is buying: $people[@index]\n";

打印:(Person X is buying: Jeff其中X表示0-4)

有点滥用标量上下文。@index = int(rand() * 5)@index列表的第0个位置放置一个0-4的随机整数。打印数组时,它会正确打印@index中的随机整数,但是当用作数组中的索引时$people[@index],@index使用标量上下文,并为其指定列表大小的值,即1

有趣的是,@people[@index]使其正确索引。

有趣的@people[@index]是,Perl中有一个哈希片,因此@index在列表上下文中对其进行了评估。在这种情况下,它是一个条目列表,这就是为什么它可以正常工作的原因


因此,在C(++)术语中,发生了从列表到标量的隐式转换,因为在建立索引时,期望标量吗?
iFreilicht 2014年

@iFreilicht正确。在Perl中,可以根据表达式的显示位置将它们评估为列表或标量。结果,根据上下文,相同的表达式可能意味着不同的含义。@在“列表上下文”中,列表变量(即带有前缀的变量)被解释为其所有元素,但在“标量上下文”中,它是等于列表中元素总数的标量。因此,在字符串中,list变量具有list上下文并被插值,我们得到Person X is buying。但作为一个数组索引,它得到标量上下文,并得到解释为1
阿伦ģ

3
问题是当Perl程序员看到时my @index = ...,他立即想知道“ WTF ?!”。
derobert 2014年

@derobert,你为什么想知道?您经常会看到类似的代码…… my @letters = 'a' .. 'z'; my @squares = map $_**2, 1..20; my @sorted = sort { lc $a cmp lc $b } @words;等等
Matthias

@Matthias,因为该行将选择并存储单个值,而不是标量,而是将其存储在数组中。
derobert 2014年

23

ECMAScript

// Randomly pick a person on only one line!
var people = [('John', 'Jeff', 'Emma', 'Steve', 'Julie')];

console.log(people[new Date() % people.length | 0]);

总是选择朱莉。

它在方括号内有括号,并且逗号运算符返回其右操作数的值。
也很容易错过。我以前在实际代码中已经错过了它。


这真令人愉快。最后,该可怕的操作符的用法。
肯恩(Keen)2014年

5
在这种情况下,逗号在技术上是运算符,而不是分隔符。ecma-international.org/ecma-262/5.1/#sec-11.14这太可怕了。除非您希望代码难以阅读。就像您在这里一样。所以,荣誉。
Keen

2
@Cory是的,我同意-尽管我一直在带有功能表达式(例如(a,b)=>(a=b[0],b))的Code Golf中使用它。我已经澄清了答案。
牙刷

21

C#

using System;

namespace LetsTroll {
    class Program {
        static void Main() {
            var names = new string[]{ "John", "Jeff", "Emma", "Steve", "Julie" };
            var random = new Random(5).NextDouble();
            var id = (int)Math.Floor(random);
            Console.WriteLine(names[id]);
        }
    }
}

诀窍是,该方法new Random().NextDouble()返回0到1之间的双精度。通过应用Math.Floor()此值,它将始终为0。


24
它经不起我的快速浏览。;)
Martin Ender 2014年

1
@TimS。像那样?:P
Knerd 2014年

2
+1,好多了-我知道您实际上在做什么,但是它可能使不太熟悉该API的人感到困惑。
Tim S.

1
我不知道这个 如果要指定种子,为什么不使用正确的方法获取“随机”整数:var random = new Random(5); var id = random.NextInt(5);
clcto 2014年

2
在我看来,@ clcto包括两次它更有可能使某人进行两次尝试,询问原因并查看问题。一次包含它,然后再包含不必要的代码,会带来一些重定向/不足。奖励:如果某人修复了一个错误,那么另一个也存在。
Tim S. 2014年

18

C#

var names = new string[] {"John", "Jeff", "Emma", "Steve", "Julie"};
var guidBasedSeed = BitConverter.ToInt32(new Guid().ToByteArray(), 0);
var prng = new Random(guidBasedSeed);
var rn = (int)prng.Next(0, names.Length);
Console.WriteLine(names[rn]);

暗示:

从GUID生成种子。向导有4×10−10的碰撞机会。超级随机。

回答:

至少当您使用时Guid.NewGuid(),糟糕!(偷偷摸摸地使种子始终为0的方式)。指向错误也没有意义(int)。


我可能做的另一种方法是AddRangeConcat在向中添加名称时陷入混乱List<string>。我确实有一个带有偷偷摸摸的IEqualityComparer的哈希集,但这太不寻常了。以我的功劳,当我发布这篇文章时,基于种子的答案并不多。
内森·库珀

我猜您的想法与我相同,但是您的速度更快,并且很难看清。+1!
tsavinho 2014年

7
播种随机数生成器是一个显而易见的技巧,但是您已经在这里将其巧妙地隐藏了。可爱的工作。
TRiG 2014年

18

bash / coreutils

这几乎是我为类似目的编写的脚本的逐字记录。

#!/bin/bash
# Sort names in random order and print the first
printf '%s\n' John Jeff Emma Steve Julie | sort -r | head -1

甚至忘记使用大写字母R也是我在现实生活脚本中偶尔犯的一个错误。


3
你能给个更好的解释吗?您当前的课程确实很短,对不太熟悉bash的人没有帮助。
iFreilicht 2014年

6
-r指定反向(字典式)排序,因此将始终选择Steve。可以将其视为-R随机排序的纯真错字
2014年

3
这是一个很好的提醒,不要信任注释,而要仔细阅读代码!
TecBrat

16

红宝石

names = ["John", "Jeff", "Emma", "Steve", "Julie"]

puts names.sort{|x| rand()}.first

这可以正常使用sort_by,但sort需要一个类似的比较功能<=>。rand()的结果将始终为正,因此只要您的Ruby实现的sort算法是确定性的,它将始终产生等效的结果。我的Ruby 1.9.3始终输出Julie。


12

红宝石

names = ["John", "Jeff", "Emma", "Steve", "Julie"]

puts names[rand() % 5]

rand() 没有参数的情况下会产生0到1之间的随机浮点数。因此,模5不会执行任何操作,并且在使用float参数将其切成数组时,Ruby会将其舍入,因此始终返回John。


11

佩尔

3 srands将使其随机性提高三倍!

#!perl
use feature 'say';

sub random_person {
    my ($aref_people) = @_;
    srand; srand; srand;
    return $aref_people->[$RANDOM % scalar @$aref_people];
}

my @people = qw/John Jeff Emma Steve Julie/;
my $person = random_person(\@people);

say "$person makes next round of drinks!";

说明

perl中没有$ RANDOM,这是一个未定义的变量。代码将始终返回列表中的第一个元素-在John上喝酒:)

编辑:

阅读完代码后,五个家伙之一决定修复明显的错误,并生成以下程序:

#!perl
use feature 'say';

sub random_person {
    my ($aref_people) = @_;
    return $aref_people->[rand $#$aref_people];
}

my @people = qw/John Jeff Emma Steve Julie/;
my $person = random_person(\@people);

say "$person buys next round of drinks!";

您能仅通过查看代码来告诉谁做了吗?

说明:

在Perl中,$#array返回最后一个元素的索引;由于数组是从零开始的,因此给定具有五个元素的数组的引用$#$aref_people将为4
rand返回一个大于或等于零且小于其参数的随机数,因此它将永远不会返回4,这实际上意味着朱莉将永远不会购买饮料:)


1
$RANDOM在bash,ksh和zsh中是一个真正的功能(但在perl中不是)。
kernigh 2014年

10

蟒蛇

大家都知道,在如此小的样本空间中,您不能相信随机性。为了使它真正随机,我放弃了从列表中选择名称的过时方法,而我的程序将拼出一个完全随机的名称。由于办公室中的大多数名字都有4个字母,我们将为此解决。

import random

def CHR (n):
    # Just easily convert a number between 0 and 25 into a corresponding letter
    return chr(n+ord('A'))

# Seed the RNG with a large prime number. And multiply it by 2 for good measure.
random.seed (86117*2)

# Now, let's see what COMPLETELY RANDOM name will be spelled out!
totallyRandomName = ''
for i in range(4) :
    totallyRandomName += CHR(int(random.random()*26))

print (totallyRandomName)

自然,我做了一些准备工作以确保选择正确的种子。


15
播种随机数生成具有恒定是太明显..
布伦丹·朗

@BrendanLong肯定会引起人们的注意。人们希望对其进行测试以确保其随机性。当不是的时候,猜猜谁在买饮料。
JFA 2014年

10

C

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
char *name[]={"John", "Jeff", "Emma", "Steeve", "Julie"};

int i;
int n=rand()%10000;
int r=3;

for (i=0; i<10000+n; i++) // random number of iteration
    {
    r=(r*r)%10000; // my own PRNG (square and mod)
    }

printf("%s", name[r%5] );
}

抱歉,杰夫!

经过几次迭代后,由于数学原因,r == 1 mod 5。道德:如果您数学不好,请不要编写自己的PRNG。:)


10

C ++ x11

#include <vector>
#include <iostream>

int main () {
  std::srand(time(NULL));
  std::vector<std::string> choice{("jen","moss","roy")};
  std::cout << choice[rand()%choice.size()] << std::endl;
}

由于初始化程序列表中使用了括号,因此向量的大小实际上为1。逗号运算符将丢弃所有名称并返回最后一个名称,因此买方始终是Roy。


10

斯卡拉

我知道我的用户会持怀疑态度,所以我提供了一个证明我的随机性确实很公平的证明!

object DrinkChooser {

  def main(args: Array[String]): Unit = {
    proveRandomness()
    val names = List("John","Jeff","Emma","Steve","Julie")
    val buyer = names(randomChoice(names.size))
    println(s"$buyer will buy the drinks this time!")
  }

  def proveRandomness(): Unit = {
    val trials = 10000
    val n = 4
    val choices = for (_ <- 1 to 10000) yield randomChoice(n)
    (choices groupBy(identity)).toList.sortBy(_._1) foreach { case (a, x) =>
      println(a + " chosen " + (x.size * 100.0 / trials) + "%")
    }
  }

  def randomChoice(n: Int): Int = {
    var x = 1
    for (i <- 1 to 1000) { // don't trust random, add in more randomness!
      x = (x * randomInt(1, n)) % (n + 1)
    }
    x
  }

  // random int between min and max inclusive
  def randomInt(min: Int, max: Int) = {
    new scala.util.Random().nextInt(max - min + 1) + min
  }

}

一个示例运行:

1 chosen 25.31%
2 chosen 24.46%
3 chosen 24.83%
4 chosen 25.4%
John will buy the drinks this time!

除非其他人非常幸运,否则约翰将永远购买这些饮料。

随机性的“证明”依赖于这样的事实,rand(1, 4) * rand(1, 4) % 5即仍然均匀地分布在1到4之间(含1和4)。但是rand(1, 5) * rand(1, 5) % 6退化。您有可能得到0,这将使最终结果为0,而与其余“随机性”无关。



9

的JavaScript

再试一次,这有点棘手:

var getRandomEntry = function(args){
    return args[Math.floor(Math.random() * arguments.length)]; 
}

alert(getRandomEntry(["peter","julie","samantha","eddie","mark"]));

arguments变量可从本地访问函数,并且是传递给函数的所有参数的数组。通过使用简单的命名并将数组传递给函数本身,您可以欺骗我们不是在获取数组的长度,而是实际上是参数列表的长度(为1)。通过使用特殊字符或字体类型,可以更好地执行此操作。


这并不是最难发现的。任何N在JavaScript中构造了任意-ary函数的人都知道该arguments变量。
Conor O'Brien 2015年

8

C ++

公平地说,我们应该进行很多次试验,并选择最常被选的人。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <map>

static const char *names[] = { "John", "Jeff", "Emma", "Steve", "Julie" };

int main() {
    srand(time(NULL));
    std::map<int, int> counts;

    // run 2^31 trials to ensure we eliminate any biases in rand()
    for (int i = 0; i < (1<<31); i++) {
        counts[rand() % (sizeof(names)/sizeof(*names))]++;
    }

    // pick the winner by whomever has the most random votes
    int winner = 0;
    for (std::map<int, int>::const_iterator iter = counts.begin(); iter != counts.end(); ++iter) {
        if (iter->second > counts[winner]) {
            winner = iter->first;
        }
    }

    printf("%s\n", names[winner % (sizeof(names)/sizeof(*names))]);
}

有什么价值1<<31?抱歉,约翰。


扰流板问题的答案是UB。我不确定这是好是坏。
nwp

@nwp好吧,可以肯定,但是它可以容纳int是32位2的补码的任何地方,即使在64位(使用gcc)上也是如此。我还没有在Clang上进行测试。
蓬松的

不,它在int为32的补数的地方不可用。1 << 31的值不确定。不过,您很幸运,未定义的行为使编译器选择了感觉,而由于它是为提高速度而设计的,因此它只会决定什么也不做,而这恰恰是您想要的。
nwp 2014年

@nwp 1<<31 == 0x80000000无论如何,按照的定义<<,在32位2的补码中,即为INT_MIN。您是否正在考虑1<<32可能会或可能不会== 0?(因为在x86上,1<<32通常求值为1 ...)
蓬松的2014年

@nwp实际上是实现定义的。现在,如果我们谈论的是C,那么它将是不确定的。
Stuart Olsen 2014年

7

T-SQL(2008+)

SELECT TOP 1 name
FROM
 (VALUES('John'),('Jeff'),('Emma'),('Steve'),('Julie')) tbl(name)
ORDER BY RAND()

说明:

在MS SQL Server中,RAND()每次执行仅求值一次。每个名称始终分配有相同的编号,而保留原始顺序。约翰是第一位。约翰很烂。

建议的改进:

T-SQL可以产生质量不错的每行随机数RAND(CHECKSUM(NEWID()))


我认为ORDER BY NEWID()足以满足需要(不需要CHEKKSUM)
雅各布(Jacob

7

a

buyer={'John', 'Jeff', 'Emma', 'Steve', 'Julie'}
   -- use clock to set random seed
math.randomseed(os.clock())
   -- pick a random number between 1 and 5
i=math.random(5)
io.write("Today's buyer is ",buyer[i],".\n")

os.clock()用于计时目的,os.time()math.randomseed用于良好RNG的对象。可悲的是,朱莉总是购物(至少在我的电脑上)。


math.random()没有参数的话也返回范围内的数字[0,1)。-1表示不赶上。
mniip

@mniip:也应得的!我已经修复了。
Kyle Kanos 2014年

6

惯用的C ++ 11

当涉及饮料时,了解最新的标准和编码样式尤为重要。这是一个高效且符合习语的C ++ 11名称选择器的一个很好的例子。

它是从系统时钟中播种的,每次都输出种子以及名称以供验证。

#include <vector>
#include <chrono>
#include <random>
#include <iostream>

auto main()->int {
  std::vector<std::string> names;           // storage for the names
  names.reserve(5);                         // always reserve ahead, for top performance
  names.emplace_back("John");               // emplace instead of push to avoid copies
  names.emplace_back("Jeff");
  names.emplace_back("Emma");
  names.emplace_back("Steve");
  names.emplace_back("Julie");

  std::mt19937_64 engine;                   // make sure we use a high quality RNG engine
  auto seed((engine, std::chrono::system_clock::now().time_since_epoch().count()));  // seed from clock
  std::uniform_int_distribution<unsigned> dist(0, names.size() - 1);     // distribute linearly
  auto number(dist(engine));                // pick a number corresponding to a name
  std::string name(names.at(number));       // look up the name by number
  std::cout << "Seed: " << seed << ", name: " << name << std::endl;  // output the name & seed
  return EXIT_SUCCESS;                      // don't forget to exit politely
}

现场尝试一下:http : //ideone.com/KOet5H

好的,这实际上是很不错的代码;有很多红色的鲱鱼让您过于仔细地看代码,以至于看seed不到明显的事实-RNG实际上从未播种过:)在这种情况下,它只是一个整数,尽管它看起来像是engine作为参数传递给种子函数,实际上只是被忽略了。种子变量实际上是从时钟开始设置的,因此可以在末尾随名称一起输出,以增加对侮辱的伤害,但是购买饮料的始终还是史蒂夫。


1
它不使用名称的初始化列表,这使我感到震惊。最起码,你肯定成功地提供,只是代码感到过度设计。我不能说是因为“合规”还是所有杂音评论:P
vmrob

6

的JavaScript

console.log(["Jeff", "Emma", "Steve", "Julie"][Math.floor(Math.random(5))]);

好吧,很抱歉,Math.random它没有参数,并且总是返回[0,1)中的数字。尽管如此,它还是一个快乐的可变参数函数,并且不会抱怨参数!


5

蟒蛇

names=["John", "Jeff", "Emma", "Steve", "Julie"]
import random # Import random module
random.seed(str(random)) # Choose strictly random seed
print(random.choice(names)) # Print random choice

str(random)给出一个常量字符串;不是随机值


6
有点不相关的注释:如果您使用的是Python 3.2或更高版本,则第二个参数random.seed()必须为2(默认值)。如果通过version=1,则hash()字符串的代替整个字符串将用作种子,并且由于Python从3.2开始随机地为字符串的哈希值提供种子,因此您将获得一个实际随机的名称。
Blacklight Shining

5

佩尔

艾玛最好不要忘记她的钱包!在strict和下运行warnings

use strict;
use warnings;

# Use a hash to store names since they're more extendible

my %people;
$people{$_}++ for qw/John Jeff Emma Steve Julie/;

print +(@_=%people)[rand@_];  # 'cos (keys %people)[rand( keys %people )]
                              # is just too long-winded.

在这里解释。


Perl 5.18通过引入哈希密钥随机化(以避免哈希冲突复杂性攻击)对这一点进行了一些修改。
Konrad Borowski

4

的JavaScript

function getDrinksBuyer(){ 
    var people = ["Jeff", "Emma", "Steve", "Julie"];
    var rand = Math.random(0,4)|0;
    return people[rand];
}

|0在0所有的时间结果,但看起来像它做一些其他的四舍五入。


我喜欢。虽然我会这样做,parseInt(Math.random(0, 4))并且可能会添加注释,例如- Math.random返回双
精度型

5
诀窍实际上是Math.random对我们微薄的参数无关紧要。它以自己的方式选择数字。的|0正确的舍入结果意外,因此是不属于任何欺骗的源极。
肯恩2014年

|0对某些人(最有可能是我们所有人)非常明显,但是我敢打赌,有很多人不知道它的作用。那就是我所依赖的团体。
马特

3
@Matt我的意思是|0,如果您知道它的作用,那么它似乎在四舍五入,并且四舍五入,因此这不是欺骗。(如果某人不知道该怎么|0做,那么欺骗性代码就没有用;您可以告诉他们您希望他们相信的任何东西。)相反,答案中的意外行为是基于Math.random(0,4)Math.random(),因为Math.random不使用参数。
肯恩2014年

4

Ĵ

;(?.5) { 'John'; 'Jeff'; 'Emma'; 'Steve'; 'Julie'

可怜的朱莉...琐事:这可能是我写过的最干净的J ...

这段代码实际上是正确的,除了一件事。?.是统一的rng:?.5始终会返回4. ?5正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.