首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >产生随机字符串

产生随机字符串
EN

Code Review用户
提问于 2013-04-04 10:10:15
回答 1查看 1.4K关注 0票数 4

我创建了以下字符串操作函数,用于在Lua中随机设置我传递的字符串:

代码语言:javascript
复制
require "string"
require "math"

math.randomseed( os.time() )

function string.random( self )
    local tTemporary, tNew = {}, {}
    if not self or self:len() < 5 then
        return nil
    end
    self:gsub( "%a", function( cChar )
            table.insert( tTemporary, cChar )
        end
    )
    for i = 1, #tTemporary, 1 do
        local iRandom = math.random(1, #tTemporary)
        tNew[i] = tTemporary[iRandom]
        table.remove( tTemporary, iRandom )
    end
    return table.concat(tNew, "   ")
end

这能被优化/更随机化吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2013-05-04 03:32:24

有几点需要考虑:

  • 调用函数shuffle而不是random将是一个更好的名称,因为这正是它所要做的。
  • 额外的中间表实际上并不是执行洗牌所必需的。一张桌子就够了,你可以在那张桌子上执行洗牌。
  • 考虑在洗牌过程和输入存储方式之间进行更好的分离。例如,如果让您的洗牌函数接受一个表,那么该函数可以在任何类型的数据上重用,而不仅仅是字符串。
  • 我将取消匈牙利符号,只需在变量名上删除类型前缀。记住Lua变量本身没有类型。如果你后来改变了那个变量所指的内容,那么匈牙利的表示法就会产生误导。

所以我会把你的原始代码重构成两个函数。这里有一种可能性:

代码语言:javascript
复制
function shuffle(self)
  if type(self) ~= 'table' then return nil end

  for i = #self, 2, -1 do
    local randi = math.random(i)
    self[i], self[randi] = self[randi], self[i]
  end
  return self
end

function shuffle_words(str)
  local strtable = {}
  for each in str:gmatch("%a+") do
    table.insert(strtable, each)
  end
  return table.concat(shuffle(strtable), ' ')
end
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/24700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档