| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 636 人关注过本帖
标题:产生随机序列的问题,向各位高手请教!
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:20 回复次数:12 
产生随机序列的问题,向各位高手请教!
A、C、T、G四个字符随机产生500000长的字符序列,但要求A和C占随机序列的%60,这怎么弄呀?请教!谢谢!!
2013-11-16 20:52
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
要正好60%呢,还是大约60%?

重剑无锋,大巧不工
2013-11-16 21:02
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
您好  是正好%60。
当然这只是我做的一种情况,因为我还需要做正好%75、%70等等的情况,
非常麻烦您了!!!谢谢!!!
2013-11-17 12:40
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
分别用2个数组存储ACTG和TG的随机数据
事先计算%60有多少个!
边随机边统计
{
if(数目<预期数目) 随机数组1
else 随机数组2
记录产生的数组
}

仰望星空...........不忘初心!
2013-11-17 12:49
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 3楼 zhou31146001
呵呵,简单。你想要多少都行,我可以给你写段通用的代码。如果你对其它几个字符也想控制也可以,给我一个足够精确的需求描述。

比如 A、C在这60%里有没有占比要求。总之我可以让你任意控制4个字符的精确占比并保证序列的随机性。

重剑无锋,大巧不工
2013-11-17 17:46
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 5楼 beyondyf
首先非常感谢您,非常谢谢!!
A、C分别占总量%20和%40,T、G分别占总量%20和%20,当然我可能以后还会用到其他含量的,所以能够任意调换的是最好的。
非常谢谢!
2013-11-17 18:56
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
不客气。先把代码给你。

简单介绍一下程序的用法。这是个带参数的程序,共有4个参数,依次是序列的长度、A的百分占比、C的百分占比、T的百分占比。

这里没有加G的占比是因为有了前三个它可以计算出来。

由于时间关系我没有加过多的容错处理,所以输入时请正确输入。其中序列长度必须是正整数, A、C、T的百分占比可以是小数(考虑到你可能的需要)。

举个具体的例子,假设你编译后生成的可执行文件名为a.exe。

那么针对你6楼的要求那么应该在控制台里输入

a 500000 20 40 20

回车,结果将输出到屏幕。当然,我想你更愿意把输出的数据保存到一个文件里,假设为out.txt,那么就像下面这样在控制里输入

a 500000 20 40 20 > out.txt

祝你用的愉快!

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<malloc.h>

int random(int max)
{
    return ((rand() << 16)|((rand() & 1) << 15)|rand()) % max;
}

int main(int argc, char ** argv)
{
    int n, a, c, t, g, i, j;
    char * s, tmp;
    
    if(argc != 5) return 0;
    srand(time(NULL));
    
    n = atoi(argv[1]);
        if(n < 0) return 0;
    a = (int)(atof(argv[2]) / 100 * n + 0.5);
    if(a < 0) return 0;
    c = (int)(atof(argv[3]) / 100 * n + 0.5);
    if(c < 0) return 0;
    t = (int)(atof(argv[4]) / 100 * n + 0.5);
    if(t < 0) return 0;
    g = n - a - c - t;
    if(g < 0) return 0;

    if(!(s = (char *)malloc(n + 1))) return 0;

    for(i = 0; a--; s[i++] = 'A');
    for(; c--; s[i++] = 'C');
    for(; t--; s[i++] = 'T');
    for(; g--; s[i++] = 'G');
    s[n] = '\0';

    for(i = 0; i < n; i++)
    {
        j = random(n);
        tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
    
    puts(s);
    free(s);
    return 0;
}

重剑无锋,大巧不工
2013-11-17 21:06
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 7楼 beyondyf
非常感谢您,帮了我很大忙。
我想在询问一下,这个程序在C运行平台VC6.0也能运行吧,
如果可以c运行环境即VC6.0的控制平台是怎样具体操作的,怎么在C平台输入那些数呢?
谢谢,又麻烦你了!
2013-11-17 21:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,纠正一下,这个程序可以在任何电脑上运行。没有什么C平台一说。这个程序可以用VC6.0编译。编译好后你能找到这个程序所在的位置吧?

之后你需要打开控制台窗口,具体操作方法:

点击你电脑屏幕左下角的开始按钮(vista或win7系统则就是左下角那个windows徵标)

在弹出的菜单里点击运行(vista或win7则在搜索框里直接输入),输入cmd,即可打开控制台。

将你当前的工作目录切换到你程序所在的位置,然后按我之前的例子输入即可。

学编程一定要掌握命令行的基础使用。

如果短时间内你还不能掌握命令行的使用的话我也可以给你写一个视窗程序,不过我手头的工具只能用C#写,你的电脑上至少要安装有2.0以上版本的.net framework才能执行。

重剑无锋,大巧不工
2013-11-17 21:56
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
您好,如果用fscanf()、fprintf()那种输出能编出这样的程序吗?
我刚才按您说的操作了,没有弄出来,还是学识太浅,非常不好意思。
谢谢!!!!
2013-11-17 22:33
快速回复:产生随机序列的问题,向各位高手请教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027500 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved