random.shuffle在transcrypt中不起作用

时间:2017-12-10 16:55:17

标签: python

我想使用transcrypt将python脚本转换为javascript。该脚本在python'random'模块中使用'shuffle'。

我把问题归结为这个例子:

l = [ '1', '2' ]
from random import shuffle
while True:
   thing = input( 'thing' )
   print( 'before: {}'.format( ' '.join( l )))
   shuffle( l )
   print( 'after: {}'.format( ' '.join( l )))

这失败了 - 如果我注释掉'shuffle(l)'行,那么它运行正常。

不支持随机播放吗?

示例已编辑,因此python有效 - 即使之前的无效python生成的javascript运行&用“随机”

显示问题

我可以看到错误的javascript输出:

                var _random_integer = function () {
                    if (_index == 0) {
                        _fill_array ();
                    }
                    var y = _array [_index];
                    y ^= y >> 11;
                    y ^= y << 7 & 2636928640;
                    y ^= y << 15 & 4022730752;
                    y ^= y >> 18;
                    _index = __mod__ (_index + 1, 624);
                    return y;
                };

                ...
                    var random = function () {
                    return _random_integer () / _bitmask3;
                };

                ...

(function () {
    var __name__ = '__main__';
    var l = list (['1', '2']);
    var shuffle = __init__ (__world__.random).shuffle;
    while (true) {
        var thing = input ('thing');
        print ('before: {}'.format (' '.join (l)));
        shuffle (l);
        print ('after: {}'.format (' '.join (l)));
    }

我不是javascript专家,但我似乎很清楚这一行:

var shuffle = __init__ (__world__.random).shuffle;
当'random'被发现是一个简单的函数时,

会产生运行时错误。

编辑 我通过实现自己的shuffle函数解决了这个问题(好吧,我从python库中删除它并将其破解直到它起作用):

l = [ '1', '2', '3', '4' ]

from random import randint

def shuffle( l ):
    n = len( l )
    for i in reversed( range( n )):
        if i == n - 1: continue
        # pick an element in x[:i+1] with which to exchange x[i]
        j = randint( i + 1, n - 1 )
        l[i], l[j] = l[j], l[i]

while True:
    thing = input( '>' )
    shuffle( l )
    print( ' '.join( l ))

2 个答案:

答案 0 :(得分:0)

您只需更改print即可使其正常运行:

l = [1, 2]
from random import shuffle
while True:
    thing = input( 'thing' )
    print( 'before:',  l)
    shuffle( l )
    print( 'after:', l)

方法join()需要一个字符串列表,而不是整数。 但是print()已经为你的输出做了你想做的事。

答案 1 :(得分:0)

如果我运行您的代码,我会收到错误TypeError: sequence item 0: expected str instance, int found,无论我是否注释掉shuffle()的来电,我都会收到错误。我不会说那“运行正常”。它根本不运行。那是因为您正在尝试join()整数列表,join()想要一个字符串列表。您的问题与shuffle()无关。

将列表定义更改为:

l = ["1", "2"]

并且其余代码确实可以正常运行。