数学函数生成随机数据

时间:2017-05-21 16:43:01

标签: function math equation

我不擅长数学,我试图生成一些随机数据,但我无法想象我是如何实现这一目标的。 我想生成12个显示0到100的条形图。但是我不希望它们都是随机的,我希望它们中的一些有一个很好的曲线结果,如下所示:

public class SettingsFragment extends Fragment implements ISpinnerDatePickerDialogListener, ISpinnerTimePickerDialogListener {

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // initialize listeners for text inputs, to open picker dialogs
        periodBegin = (EditText) getView().findViewById(R.id.editPeriodBegin);
        periodBegin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               showDialog(PERIOD_BEGIN_DIALOG_ID);
            }
        });

    }

    /**
     * opens dialog for id
     *
     * @param id
     */
    private void showDialog(int id) {
        switch(id) {
            case PERIOD_BEGIN_DIALOG_ID:
                SpinnerDatePickerDialog datePickerDialog;
                datePickerDialog = new SpinnerDatePickerDialog(this);
                datePickerDialog.show(getFragmentManager(), datePickerDialog.getTAG());
                break;

    }

    @Override
    public void onSpinnerDateDialogPositiveClick(SpinnerDatePickerDialog dialog) {
        // TODO send DatePicker values with listener
        // load DatePicker from dialog and set them to EditText text
        DatePicker datePicker = dialog.getDatePicker();
        int day = datePicker.getDayOfMonth();
        int month = datePicker.getMonth();
        int year = datePicker.getYear();

        // TODO
        String formattedDate = FORMAT.format(new Date(year - 1900, month, day));
        periodBegin.setText(formattedDate);
    }

    @Override
    public void onSpinnerDateDialogNegativeClick(SpinnerDatePickerDialog dialog) {
        // Nothing to do here
    }

}

澄清:

-EDIT(1)

值会像图片中的曲线一样上下变化:

突破点可能发生在任何地方。

如果我问得太多,请告诉我正确的方向,我会自己解决。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我会生成随机曲线,然后用以下条形插值:

  1. 生成n个控制点

    x(i)=i;
    y(i)=100.0*Random();
    

    您不需要x(i) ...

  2. 生成m > n

    所以只需使用n点作为BEZIER或任何其他多项式曲线的控制点并计算你的条形...让我们假设使用单cubic n=4的简单情况然后你的控制点将转换为多项式:

    y(t) = a0 + a1*t +a2*t^2 + a3*t^3
    

    所以计算每个条形大小如:

    i={0,1,2,3,...,m-1}
    t=i/(m-1); // this converts i to t=<0,1>
    bar(i) = a0 + a1*t +a2*t^2 + a3*t^3
    

    不要忘记钳制bar(i),使其不超过<0,100>。这将创建像条形一样的平滑随机曲线。

  3. 如果我将所有这些放在一起,我可以在C ++中做这样的事情:

    double  d1,d2,y0,y1,y2,y3,a0,a1,a2,a3,t;
    // n=4 random control points for cubic
    y0=100.0*Random();
    y1=100.0*Random();
    y2=100.0*Random();
    y3=100.0*Random();
    // convert them to interpolation cubic
    d1=0.5*(y2-y0);
    d2=0.5*(y3-y1);
    a0=y1;
    a1=d1;
    a2=(3.0*(y2-y1))-(2.0*d1)-d2;
    a3=d1+d2+(2.0*(-y2+y1));
    // compute m bars
    const int m=10;
    double bar[m]; int i;
    for (i=0;i<m;i++)
     {
     t=double(i)/double(m-1);
     bar[i] = a0 + a1*t +a2*t*t + a3*t*t*t;
     if (bar[i]<0.0) bar[i]=0.0;
     if (bar[i]>100.0) bar[i]=100.0;
     }
    

    代码未在此处直接编写,因此可能包含拼写错误。条形应平滑地遵循三次曲线,因此它应满足您的所有需求......您可以使用更大程度的曲线多项式和/或分段插值,以防您需要更多的凸起。有关详细信息,请参阅: