回复:一个随机排列的程序,大家帮看一下还能优化吗?(能否用FOR简化)

已锁定

为修修为

西门子1847工业学习平台

  • 帖子

    1168
  • 精华

    8
  • 被关注

    30

论坛等级:奇侠

注册时间:2021-12-02

钻石 钻石 如何晋级?

发布于 2023-12-06 09:13:14

23楼

展开查看
以下是引用xinchen在2023-12-06 08:40:48的发言 >22楼

array[] 是输出队列,这个简单,新生成的放在 currentLen + 1 位置,currentLen 类似指针,指向最新生成的数据


主要是生成的随机数是否重复的判断,前文提过最简单的不是冒泡之类的排序后用二分法判断,而是数组


假设

第一次,random = 8, 此时 sw[8] = false,说明 8 不重复,添加到队列,同时置位 sw[8] = true


同理 第二次、第三次 分别得到随机数 10,5,那同样置位 sw[10]、sw[5] 为 true;

第四次,得到随机数 10,此时 sw[10] 为 true,说明 10 已经生成过,就不用添加到 array 中了


以下是引用为修修为在2023-12-05 15:33:06的发言 >20楼:感谢指点,这段代码...

引用20楼详细内容:

感谢指点,这段代码似懂非懂,对数组操作不太明白,能否详细说一下。谢谢。

以下是引用xinchen在2023-12-05 08:34:31的发言 >18楼:嗯。。。我敢说,几...

引用18楼详细内容:

嗯。。。我敢说,几乎所有人都是直到看到 “是随机生成,不是按大小排列,是按生成顺序排列呀”这句才真正明白的需求;


就像我在6L回复的,最快的就是用数组,不用冒泡,当然也用不着 for;


' 伪代码如下

' 初始化、防呆省略,currentLen = 0, sMin = 1, sMax = 16


index = random - sMin + 1 ' 假定 数组下标都是从 1 开始

if sw[index] then ' 当前生成的随机数重复

    

else

    sw[index] = true

    currentLen = currentLen + 1

    array[currentLen]  = random ' currentLen 为输出队列当前的长度

endif




以下是引用为修修为在2023-12-04 20:54:52的发言 >15楼:是随机生成,不是...

引用15楼详细内容:

是随机生成,不是按大小排列,是按生成顺序排列呀。

以下是引用yming在2023-12-04 11:19:10的发言 >13楼:既然是伪随机数,...

引用13楼详细内容:

既然是伪随机数,而且还是大小顺序排列的。为啥“随机数”不直接按区段顺序一次输出?系统时间只是一个产生随机数的“种子”。


以下是引用为修修为在2023-12-04 08:20:21的发言 >4楼:这个是一个扫描...

引用4楼详细内容:

这个是一个扫描周期生成一个随机数,通过不断的扫描,进行比对排列,重复的弃掉。因随机数的产生是有很大概率重复的。

初始设计时想着预设1-16,然后随机排列,无法实现。另一个思路就是预设排列组,扫描排列组根据条件截取,这个重复率是很大的,主要取决于预设组的多少。

其实程序里的随机指令也是一个假随机,是截取系统纳秒。

以下是引用yming在2023-12-03 22:09:41的发言 >2楼:关于快速排列,...

引用2楼详细内容:

关于快速排列,倒是可以有所探讨。

对于整数来说,可以用“第三只眼”来看。

1010 0011 0011 1111;

0101 1000 1110 0101;

1010 1101 1101 0011;

0101 0010  0111 0101;

若是无符号正整数,你能一眼看出哪个大小么?

若是有符号的整数,那么最高位是符号位;余下的是补数表示。那么大小是与整数完全一样的判断。

sw[ ] = false或true的初始判断条件是什么呢,

如何剔除重复数据呢?

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15228条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。