生成随机数组

时间:2016-04-13 19:24:38

标签: php

我自己的快速背景。这是我第一次用PHP编写代码。我有一个计算机信息系统学位,在大学(大约15年前)学过C ++,VB,Cobol和Java,但从那时起就没有真正使用它。当我学到这一点时,有些东西会回复给我。

我试图模拟用于交易卡游戏的随机卡片组的开头。最终结果将打印4页。每个页面将列出12个卡号,以及卡上的所有信息。

这是我计划做的事情:

第一步: 从不同范围生成180个随机数。每个数字代表游戏中的一张牌。

  • 范围1 = 35-74(116个数字)
  • 范围2 = 75-106(46个数字)
  • 范围3 = 107-134(16个数字,无重复)
  • 范围4 = 135-142(2个数字,无重复)

第二步: 取180个数字并将其分解为90对。

第三步: 从90对中,将它们分解为4组6对。

第四步: 从4组6对中,列出每个号码的卡片信息,并制作4个可打印页面,每组1个。

我已经创造了180个随机数。我还在努力获取唯一的数字。我已经尝试为我需要的数字创建数组,但它们都不起作用。这是我的最后一个工作代码,它将生成我需要的180个数字,但是,范围3和4需要修复为不允许重复。

我目前使用此编码的方式,它只是在屏幕上显示数字。我应该将它们存储在一个数组中吗?我只是完全以错误的方式处理?

<?php

// generate 116 common cards
echo "Commons: " . '<br />';
for ($commonfeed = 0; $commonfeed < 116; $commonfeed++) {
echo mt_rand(35, 74). '<br />';
}

// generate 46 uncommon cards
echo "Uncommons: " . '<br />';
for ($uncommonfeed = 0; $uncommonfeed < 46; $uncommonfeed++) {
echo mt_rand(75, 106). '<br />';
}

// generate 16 rare cards
echo "Rares: " . '<br />';
for ($rarefeed = 0; $rarefeed < 16; $rarefeed++) {
echo mt_rand(107, 134). '<br />';
}

// generate 2 super rare cards
echo "Super Rares: " . '<br />';
for ($superrarefeed = 0; $superrarefeed < 2; $superrarefeed++) {
echo mt_rand(135, 142). '<br />';
}

?>

2 个答案:

答案 0 :(得分:1)

由于您正在学习编码(再次),我将使用几个指针来回答,而不是仅生成一些工作代码。

从最后一个问题开始:是的,我会将所有内容存储在一个数组中。这样,您可以从“输出”代码中分离“处理”代码。

你是以错误的方式解决这个问题吗?很难说,取决于所有的游戏机制等。但要轻松开始:是的,这是一个良好的开端。

使用array_unique,您可以创建一个唯一的数组,您可以在生成稀有卡和超级卡时使用它。

在游戏机制上:你确定你总是想给某人一张16张稀有牌和2张超级稀有牌吗?您可以做的是,预先创建完整的“卡片组”,然后选择您想要的卡片数量:

$number_of_cards = 5;
$deck = [1,1,1,1,2,2,2,2,3,3,4,4,100,101,102];
shuffle($deck); // shuffle the cards
$selected = array_slice($deck, 0, $number_of_cards); // select the amount of cards

您甚至可以使用字符串而不是整数来使用它。

答案 1 :(得分:1)

这是您可能尝试的解决方案:

def getIndices(number, values):
    '''Return a tuple (n, l) where l is a list of indices in 'values' and the
    following condition holds: n + sum(values[i] for i in l) == number.

    values -- sorted list of numbers
    number -- sum to search for

    >>> values=[10,20,20,50,100,200,200,500,1000,2000,2000,5000]
    >>> getIndices(18000, values)
    (6900, [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
    >>> getIndices(450, values)
    (0, [6, 5, 3])
    >>> getIndices(15, values)
    (5, [0])
    >>> getIndices(10, values)
    (0, [0])
    >>> getIndices(5, values)
    (5, [])
    >>> getIndices(0, values)
    (0, [])

    This simplicist algorithm does not always find a solution with 'n' == 0,
    even if one exists. The following test fails, it returns (10, [2])
    instead.

    >>> getIndices(40, [20, 20, 30])
    (0, [0, 1])

    '''
    n = number
    l = []

    for i in range(len(values) - 1, -1, -1):
        if values[i] <= n:
            l.append(i)
            n -= values[i]

    assert(n + sum(values[i] for i in l) == number)
    return n, l


if __name__ == '__main__':
    import doctest
    doctest.testmod()

最后,我并不完全确定我认为起草过程没问题,但在我看来,随机化是最大的问题,我解决了它。同样,如果您认为 shuffle 不够好,可以采用不同的方式,但那是另一个故事;)