Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我可以在clojure中进行确定性的混洗吗?

我可以在clojure中进行确定性的混洗吗?
EN

Stack Overflow用户
提问于 2013-02-12 15:54:48
回答 3查看 1.4K关注 0票数 9

我想对集合进行一些打乱,每次我的程序运行时都是一样的:

这是一种方法:

代码语言:javascript
运行
AI代码解释
复制
(def colours ["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"])

(defn colour-shuffle [n] 
  (let [cs (nth (clojure.math.combinatorics/permutations colours) n)]
    [(first cs) (drop 1 cs)]))

; use (rand-int 40320) to make up numbers, then hard code:
(def colour-shuffle-39038 (colour-shuffle 39038))
(def colour-shuffle-28193 (colour-shuffle 28193))
(def colour-shuffle-5667  (colour-shuffle 5667))
(def colour-shuffle-8194  (colour-shuffle 8194))
(def colour-shuffle-13895 (colour-shuffle 13895))
(def colour-shuffle-2345  (colour-shuffle 2345))

colour-shuffle-39038 ; ["white" ("magenta" "blue" "green" "cyan" "yellow" "red" "black")]

但它需要一段时间来评估,而且看起来很浪费,而且相当不优雅。

有没有什么方法可以直接生成混洗39038,而不用生成和消耗所有的序列?

(我已经意识到我可以对它们进行硬编码,或者使用宏将工作带回编译时。这似乎也有点垃圾。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-12 19:58:06

听起来你想要number permutations

代码语言:javascript
运行
AI代码解释
复制
(def factorial (reductions * 1 (drop 1 (range))))

(defn factoradic [n] {:pre [(>= n 0)]}
   (loop [a (list 0) n n p 2]
      (if (zero? n) a (recur (conj a (mod n p)) (quot n p) (inc p)))))

(defn nth-permutation [s n] {:pre [(< n (nth factorial (count s)))]}
  (let [d (factoradic n)
        choices (concat (repeat (- (count s) (count d)) 0) d)]
    ((reduce 
        (fn [m i] 
          (let [[left [item & right]] (split-at i (m :rem))]
            (assoc m :rem (concat left right) 
                     :acc (conj (m :acc) item))))
      {:rem s :acc []} choices) :acc)))

让我们试一下:

代码语言:javascript
运行
AI代码解释
复制
(def colours ["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"])

(nth-permutation colours 39038)
=> ["white" "magenta" "blue" "green" "cyan" "yellow" "red" "black"]

...as,但不生成任何其他排列。

很好,但是我们能把它们都买下来吗?

代码语言:javascript
运行
AI代码解释
复制
(def x (map (partial nth-permutation colours) (range (nth factorial (count colours)))))

(count x)
=> 40320
(count (distinct x))
=> 40320
(nth factorial (count colours))
=> 40320

请注意,排列是按(按索引排列的字典)顺序生成的:

代码语言:javascript
运行
AI代码解释
复制
user=> (pprint (take 24 x))
(["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"]
 ["red" "blue" "green" "yellow" "cyan" "magenta" "white" "black"]
 ["red" "blue" "green" "yellow" "cyan" "black" "magenta" "white"]
 ["red" "blue" "green" "yellow" "cyan" "black" "white" "magenta"]
 ["red" "blue" "green" "yellow" "cyan" "white" "magenta" "black"]
 ["red" "blue" "green" "yellow" "cyan" "white" "black" "magenta"]
 ["red" "blue" "green" "yellow" "magenta" "cyan" "black" "white"]
 ["red" "blue" "green" "yellow" "magenta" "cyan" "white" "black"]
 ["red" "blue" "green" "yellow" "magenta" "black" "cyan" "white"]
 ["red" "blue" "green" "yellow" "magenta" "black" "white" "cyan"]
 ["red" "blue" "green" "yellow" "magenta" "white" "cyan" "black"]
 ["red" "blue" "green" "yellow" "magenta" "white" "black" "cyan"]
 ["red" "blue" "green" "yellow" "black" "cyan" "magenta" "white"]
 ["red" "blue" "green" "yellow" "black" "cyan" "white" "magenta"]
 ["red" "blue" "green" "yellow" "black" "magenta" "cyan" "white"]
 ["red" "blue" "green" "yellow" "black" "magenta" "white" "cyan"]
 ["red" "blue" "green" "yellow" "black" "white" "cyan" "magenta"]
 ["red" "blue" "green" "yellow" "black" "white" "magenta" "cyan"]
 ["red" "blue" "green" "yellow" "white" "cyan" "magenta" "black"]
 ["red" "blue" "green" "yellow" "white" "cyan" "black" "magenta"]
 ["red" "blue" "green" "yellow" "white" "magenta" "cyan" "black"]
 ["red" "blue" "green" "yellow" "white" "magenta" "black" "cyan"]
 ["red" "blue" "green" "yellow" "white" "black" "cyan" "magenta"]
 ["red" "blue" "green" "yellow" "white" "black" "magenta" "cyan"])
票数 3
EN

Stack Overflow用户

发布于 2015-09-08 08:26:53

clojure.core/shuffle使用java.util.Collection/shuffle,它使用一个可选的随机数生成器。clojure.core/shuffle不使用此参数,但您可以使用它来创建带有附加种子值参数的shuffle变体,并使用该种子值创建传递给java.util.Collection/shuffle的随机数生成器

代码语言:javascript
运行
AI代码解释
复制
(defn deterministic-shuffle
  [^java.util.Collection coll seed]
  (let [al (java.util.ArrayList. coll)
        rng (java.util.Random. seed)]
    (java.util.Collections/shuffle al rng)
    (clojure.lang.RT/vector (.toArray al))))
票数 9
EN

Stack Overflow用户

发布于 2013-02-12 16:24:36

我的建议是:使用闭包,并且只计算一次排列。然后重用这些排列来从中选择一个元素。在你的函数colour-shuffle中,每次调用都会重新计算排列,效率不是很高。

代码语言:javascript
运行
AI代码解释
复制
(use 'clojure.math.combinatorics)

(def colours ["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"])

(def select-permutation
  (let [perms (permutations colours)]
    (fn [n]
      (nth perms n))))

(defn colour-shuffle [n] 
  (let [cs (nth (permutations colours) n)]
    [(first cs) (drop 1 cs)]))

(time (do  (def colour-shuffle-39038 (colour-shuffle 39038))
           (def colour-shuffle-28193 (colour-shuffle 28193))
           (def colour-shuffle-5667  (colour-shuffle 5667))
           (def colour-shuffle-8194  (colour-shuffle 8194))
           (def colour-shuffle-13895 (colour-shuffle 13895))
           (def colour-shuffle-2345  (colour-shuffle 2345))))

(time (do (def select-permutation-39038 (select-permutation 39038))
          (def select-permutation-28193 (select-permutation 28193))
          (def select-permutation-5667  (select-permutation 5667))
          (def select-permutation-8194  (select-permutation 8194))
          (def select-permutation-13895 (select-permutation 13895))
          (def select-permutation-2345  (select-permutation 2345))))

(time (do  (def colour-shuffle-39038 (colour-shuffle 39038))
           (def colour-shuffle-28193 (colour-shuffle 28193))
           (def colour-shuffle-5667  (colour-shuffle 5667))
           (def colour-shuffle-8194  (colour-shuffle 8194))
           (def colour-shuffle-13895 (colour-shuffle 13895))
           (def colour-shuffle-2345  (colour-shuffle 2345))))

(time (do (def select-permutation-39038 (select-permutation 39038))
          (def select-permutation-28193 (select-permutation 28193))
          (def select-permutation-5667  (select-permutation 5667))
          (def select-permutation-8194  (select-permutation 8194))
          (def select-permutation-13895 (select-permutation 13895))
          (def select-permutation-2345  (select-permutation 2345))))

输出:

代码语言:javascript
运行
AI代码解释
复制
"Elapsed time: 129.023 msecs"
"Elapsed time: 65.472 msecs"
"Elapsed time: 182.226 msecs"
"Elapsed time: 5.715 msecs"

请注意,使用select-permutation的第二次运行时间甚至更快。这是因为惰性序列的结果在计算后被缓存。在lazy-seq中非常深入地请求一个元素将导致所有前面的元素也被计算出来。这就是为什么第一次运行需要更长的时间。当从一个新的lazy-seq请求第39039个元素时,将导致至少计算39040个元素(以32个元素为单位)。

顺便说一句,如果你的随机数无论如何都要硬编码,你也可以硬编码上面检索到的排列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14836414

复制
相关文章
python google app engine
云计算的三个层次:issa:paas:saas 云计算有三个层次。图12-1 显示了每个层次,以及对应层次的代表产品。最低层的是IaaS(Infrastructure-as-a-Service),即提供计算机本身基本的计算能力(物理形式或虚拟形式)、存储(通常是磁盘)、计算。亚马逊Web 服务(Amazon Web Services,AWS)提供了弹性计算云(Elastic Compute Cloud,EC2),以及简单存储系统(Simple Storage System,S3)服务,这两者就在IaaS 层面。Google 也提供了IaaS 存储服务,称为Google Cloud Storage。Google App Engine 作为云计算的中间一层,称为Paas(Platform-as-a-Service)。这一层为用户的应用提供执行平台。最高一层是Software-as-a-Service(SaaS)。在这一层,用户只须简单地访问应用,这些应用位于本地,但只能通过因特网访问。SaaS 的例子包括基于Web的电子邮件服务,如Gmail、Yahoo! Mail 和Hotmail。
用户5760343
2022/05/14
5470
python google app engine
折腾Google App Engine:上传应用
作者:matrix 被围观: 2,015 次 发布时间:2013-07-26 分类:兼容并蓄 零零星星 | 无评论 »
HHTjim 部落格
2022/09/26
1K0
折腾Google App Engine:上传应用
为MyEclipse安装google app engine插件
我的淘宝客网站准备先放到google app engine上,所以需要为MyEclipse安装google app engine的插件。
明年我18
2019/09/18
7960
为MyEclipse安装google app engine插件
Google Adsense 整合了 Google Analytics
根据 Google AdSense 官方博客最新发布的日志,Google AdSense 将整合 Google Analytics。Google 将逐渐给 Google AdSense 发布商提供邀请使用该功能,如果你的账号启用该功能的时候,就可以在 Google AdSense 的 'Overview' 和 'Advanced Reports' 页面的上方看到一个邀请链接。
Denis
2023/04/14
6300
Google Adsense 整合了 Google Analytics
DevOps工具介绍连载(20)——Google App Engine
2008年4月7号,Google在Campfire One上介绍了一种简化创建、运行和构建伸缩性Web应用的工具——Google App Engine。简而言之,Google App Engine允许你本地使用Google基础设施构建Web应用,待其完工之后再将其部署到Google基础设施之上。
顾翔
2020/03/12
2.8K0
基于Google App Engine 的Adsense投放监控系统
         题外话,如果让我选择我最讨厌的一种计算机程序语言,排名第一的是Python。原因只有一个,这种靠缩进来区分块block的语法格式太折磨人了。所以2年前决定学动态语言的时候,我选择了Ruby,当然还有Rails。         但是Google App Engine选择了Python ,没办法,我只好将就这用用了。         言归正传。 google Adsense 是Google的聚宝盆,同时也是很多站长、博客的摇钱树。Google、广告商、广告发布商是一个链条上的利益共同体。在这个链条上Google是掌握 着所有的流量流向、资金流向,正是因为GOOGlE信奉不作恶的理念才让这个链条上的各方安分守己做好自己的事情。         然而追求利益最大化是每个人、每个公司的天性。广告商想用最低的价格发布广告,所以网络上有了Google Adsense 低价网站黑名单;广告发布商想提高自己的收入,所以Google要封杀欺诈点击。         那么,基于Google App Engine 的Adsense投放监控系统能做什么呢?         这个工具是我用一个周末的时间完成的,我也信奉不作恶的原则,因此这个工具只有2个功能:         1、作为广告发布商,告诉你发布了谁的广告。         2、作为广告商、告诉你谁发布了你的广告。      如果你是一位站长、如果你是一名博客写手并且你使用了Google Adsense广告。      那么我强烈推荐您使用:基于Google App Engine 的Adsense投放监控系统 http://20081949.appspot.com/      使用Google App Engine的服务,因此你需要一个Google帐号才能使用这项服务。
田春峰-JCJC错别字检测
2019/02/14
9790
Google Earth Engine使用
谷歌的地理引擎,通过一些简单的API我们就可以在几十PB大小的数据内进行弹性运算,以获得我们需要的结果。我们每个人都有权利平等的来享受这个美好的世界。
云深无际
2021/10/20
1.4K0
Google Earth Engine使用
Google Earth Engine(趋势分析)
之前有小伙伴想让做一期利用GEE做植被指数变化的文章,可惜一直没什么时间去做。今天小编终于把这个给做好了。
气象学家
2020/06/29
3.1K0
Google Earth Engine(趋势分析)
面向网站的Google Analytics
Google Analytics 提供与您网站的访问者流量和营销情况相关的详细统计信息,让您更好地了解您的受众群体。对于任何有志于增加访问者群体的网站所有者来说,它都是有益处的。
PantaZheng
2018/09/13
2.7K0
面向网站的Google Analytics
Google Earth Engine(区域统计)
在通过GEE计算遥感的地表参量以后,我们就需要对计算出来的数据进行统计。GEE上面画图的功能并不是很齐全,得到的效果也不尽如人意。因此我们就需要将GEE对区域的统计量进行导出,导入到本地以后,再进行绘图。
GIS与遥感开发平台
2022/04/29
1.4K0
Google Earth Engine(区域统计)
Google Earth Engine(监督分类)
本次我们讲一下如何利用GEE做监督分类。训练器我们选择随机森林,数据选择Landsat-8,我们只使用其中的2-7波段。
GIS与遥感开发平台
2022/04/29
1K0
Google Earth Engine(监督分类)
Google Earth Engine(趋势分析)
之前有小伙伴想让做一期利用GEE做植被指数变化的文章,可惜一直没什么时间去做。今天小编终于把这个给做好了。
GIS与遥感开发平台
2022/04/29
1.1K0
Google Earth Engine(趋势分析)
用Google Analytics分析WordPress
Google Analytics(分析)提供与您网站的访问者流量和销售相关的详细统计信息,让您更好地了解您的受众群体。对任何有兴趣增加访客群的网站所有者都有好处。
Techeek
2018/09/19
4.6K0
用Google Analytics分析WordPress
点击加载更多

相似问题

运行web应用5天后性能下降,如何发现瓶颈?

81

迭代多个列表(性能没有下降)

13

PostgreSQL索引表性能突然下降

10

PostgreSQL自真空导致性能显著下降

14

Tensordot的性能瓶颈

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档